工厂方法模式

工厂方法模式

简单工厂模式里无法避免的是一串一串的switc判断语句,工厂方法模式在一定程度上可以解决这个问题 维基百科

首先来一个UML图吧:

工厂方法模式_第1张图片
uml图
首先是一个要被生产的类接口,还是Car
public interface ICar {
    public void run();
}
然后是生产Car的工厂接口
/**
 * 工厂接口
 * @author senninha
 *
 */
public interface IFactory {
    ICar createCar();
}

约定两个类实现了ICar接口,分别是MclarenCar,FerrariCar,代码就省略了

有多少个被生产对象实现类就需要有多少个工厂方法实现类

MclarenFactory
/**
 * 工厂方法的实现类
 * @author senninha
 *
 */
public class MclarenFactory implements IFactory {

    @Override
    public ICar createCar() {
        // TODO Auto-generated method stub
        return new CarMclaren();
    }

}

FerrariFactory
/**
 * 工厂方法实现类
 * @author senninha
 *
 */
public class FerrariFactory implements IFactory {

    @Override
    public ICar createCar() {
        // TODO Auto-generated method stub
        return new CarFerrari();
    }

}
测试类
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        IFactory mF = new MclarenFactory();
        ICar m = mF.createCar();
        
        IFactory fF = new FerrariFactory();
        ICar f = fF.createCar();
        
        m.run();
        f.run();
}


来,回顾一下以上的写法和普通的写法有什么不同
如果是普通的写法,就是直接在Test方法里这么写:

ICar m = new MclarenCar();
ICar f = new FerrariCar();

这个时候,如果需要更改MclarenCar类里具体的方法的实现,该怎么办?
1.是直接修改调用的地方,药丸,如果多个地方都调用了怎么办,并且很多时候写的是工具类,给其他程序员调用的,怎么去改别人的代码?
2.直接修改MclarenCar类,这样就违背了开放-封闭原则

在这两者中间通过IFactory作"中介",这个时候只需要在IFactory的实现类里做文章即可.

你可能感兴趣的:(工厂方法模式)