基于第一章的简单工厂模式 我们会发现这个简单工厂有很大的限制。从现实生活上来看,太不专业了,你一个简单工厂可以创造任何牌子的牛奶。这在实际上也是行不通的。除非类似于拼夕夕那里的产品工厂。在真正的实际中,不同品牌的牛奶因为具体的制作工艺其他的相关原料等问题肯定不会是一个工厂来制造。
举个栗子
/**
* 工厂方法的本源,工厂接口
*奶企的常规操作,生成牛奶
*/
public interface IMilkFactory {
IMilkcreateMilk();
}
蒙牛、伊利、三元分别有自己的工厂来实现生产牛奶的功能
public class MengniuFactoryimplements IMilkFactory {
@Override
public IMilkcreateMilk() {
return new MengniuMilk();
}
}
public class SanYuanFactoryimplements IMilkFactory {
@Override
public IMilkcreateMilk() {
return new SanYuanMilk();
}
}
public class YiLiFactoryimplements IMilkFactory {
@Override
public IMilkcreateMilk() {
return new YiLiMilk();
}
}
三个工厂已经创建完毕,并且已经实现了生成各自牛奶的功能
我们的具体测试类如下
public class FuncFactoryTest {
public static void main(String[] args) {
IMilk mengNiu =new MengniuFactory().createMilk();
IMilk yiLi =new YiLiFactory().createMilk();
IMilk sanYuan =new SanYuanFactory().createMilk();
System.out.println(mengNiu.createMilk());
System.out.println(yiLi.createMilk());
System.out.println(sanYuan.createMilk());
}
}
类图如下:
特点
在以上实例里,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
缺点
我们的客户端自己来实现具体的工厂创建。假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。
网友评论