工厂模式

70 阅读2分钟

工厂模式:定义一个创建对象的接口,由子类来确定要创建的具体对象

介绍简单工厂方法模式的时候举了一个炒饭的例子。现在假设,饭店被北京的老板投资了,要去北京开一家分店。

好的饭店会根据不同区域顾客的口味对炒饭稍微做点调整,例如北方偏咸,南方偏甜。那么对于原来的简单工厂做个稍微的调整;

public class SimpleFriedRiceFactory {
    
    /**
    *@type 炒饭类型
    *@flavor 口味
    */
    public static FriedRice getFriedRice(String type, String flavor) {
        FriedRice friedRice;
        if ("north".equals(flavor)) {
           if ("JiangYouFriedRice".equals(riceType)) {
            	friedRice = new NorthJiangYouFriedRice();
        	} else if ("YangZhouFriedRice".equals(riceType)) 			{
            	friedRice = new NorthYangZhouFriedRice();
        	} 
        } else if ("south".equals(flavor)) {
            if ("JiangYouFriedRice".equals(riceType)) {
            	friedRice = new SouthJiangYouFriedRice();
        	} else if ("YangZhouFriedRice".equals(riceType)) 			{
            	friedRice = new SouthYangZhouFriedRice();
        	} 
        }
        
         ...
        friedRice.prepare();
        friedRice.fried();
    }
}

在简单工厂方法的基础上,新增了“口味”的参数,通过先区分不同的口味,在区分炒饭的类型,来生成具体的炒饭对象。

但是这样的改动已经让代码越来月复杂。再去其他地方开分店的时候,有需要新增不一样的口味。是时候升级一下了。

首相先定义一个创建对象的父类,并预留创建对象的接口。

public class FriedRiceFactory {
    
    public FriedRice getFriedRice(String type) {
        // 预留给子类决定要创建的对象
    }
}

对于北方的饭店可以实现自己的工厂。

public class NorthFriedRiceFactory extends FriedRiceFactory{
    
    public FriedRice getFriedRice(String type) {
        if ("JiangYouFriedRice".equals(riceType)) {
           	friedRice = new NorthJiangYouFriedRice();
        } else if ("YangZhouFriedRice".equals(riceType)) {
           	friedRice = new NorthYangZhouFriedRice();
        }
    }
}

南方的饭店也可以实现自己的工厂。

public class SouthFriedRiceFactory extends FriedRiceFactory{
    
    public FriedRice getFriedRice(String type) {
        if ("JiangYouFriedRice".equals(riceType)) {
           	friedRice = new SouthJiangYouFriedRice();
        } else if ("YangZhouFriedRice".equals(riceType)) {
           	friedRice = new SouthYangZhouFriedRice();
        }
    }
}

如果以后需要在其他区域开分店,就不需要给更改原有的创建对象的方法了,只需要继承 FriedRiceFactory ,让新的工厂对象来决定创建的具体对象就行了。

这种把实例化对象的逻辑放到子类中决定的模式就是工厂方法模式;