工厂方法模式

需要配合笔记中的简单工厂模式这一篇来看;

  定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例延迟到其子类。
  在工厂方法模式中有如下角色:

  • Product:抽象产品类;
  • ConcreteProduct:具体产品类,实现Product;
  • Factory:抽象工厂类,该方法返回一个Product类型的对象;
  • ConcreteFactory:具体工厂类,返回ConcreteProduct实例;

工厂方法模式的简单实现

  抽象工厂里面写一个createComputer()方法,想生产哪个牌子的计算机就生产哪个品牌的计算机。
(1)创建抽象工厂

public adbstract class ComputerFactory{
    public abstract <T extends Computer> T createCoputer(Class<T> clz);
}

(2)具体工厂
  比如某个代工厂是一个具体的工厂,其继承抽象工厂,通过反射来生产不同厂家的计算机。

public class DemoComputerFactory extends ComputerFactory{
    @Override
    public <T extends Computer> T createComputer(Class<T> clz){
        Computer computer = null;
        String className = clz.getName();
        try{
            //通过反射来生产不同厂家的计算机;
            computer = (Computer) Class.forName(className).newInstance();
        }catch(Exception e){
            e.printStackTrace();
        }
        return (T)computer;
    }
}

(3)客户端调用
  客户端创建DemoComputerFacory,并分别生产联想、惠普、华硕计算机。

public class Client{
    public static void main(String[] args){
        ComputerFactory computerFactory = new DemoComputerFactory();
        LenovoComputer lenoveComputer = computerFactory.createComputer(LenovoComputer.class);
        lenovoComputer.start();
        HpComputer hpComputer = computerFactory.createComputer(HpComputer.class);
        hpComputer.start();
        AsusComputer asusComputer = computerFactory.createComputer(AsusComputer.class);
        asusComputer.start();
    }
}

工厂方法与简单工厂

  对于简单工厂模式,其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的类。对客户端来说,这去除了与具体产品的依赖;但同时也带来了一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个case分支条件,这违背了开放封闭原则,对修改也开放了。而工厂方法模式就没有违背这个开放封闭原则。如果我们需要生产苹果计算机,则无需修改工厂类,直接创建产品即可。

-
-
-
-
-
-
-
-
-
-
-
-------------------last line for now------------------