学习的脚步不能停。。。
上一篇 简单工厂模式 中我们无所不能的 1024 从一个单身狗华丽丽的转变成了亿万男同胞心中的偶(渣)像(男),1024 开始膨胀了,想着古代皇帝可以后宫佳丽三千,我要我的时间除了我就是佳丽,他骄傲了,因为他无所不能嘛,你不断的给工厂传达指令,俄罗斯的,爱尔兰的,日本的。。。
累死工厂建后宫
分别添加三个类RussiaGirlFriend,JapanGirlFriend,IrelandGirlFriend 作为俄罗斯,日本,爱尔兰的对象,同样扩展了GirlFriendNationality 添加枚举,最后需要在工厂GirlFriendFactory中三个switch中添加case分支。
这里有心的朋友能看出,简单的工厂模式已经不满足开闭原则,不方便扩展,这时需要引入工厂方法模式。
简单工厂->工厂方法为了满足无所不能的 1024 的一己私欲,工厂负责人一边疯狂的改造,一边抓狂的想着更好的办法,工厂一直在不停的改造,万一其中一个环节出了问题,下面就没有办法继续工作下去了,如果 1024 又要泰国的,意大利的需要不停的改造不利于扩展,又一番改造。。。
public abstract class GirlFriendFactory { abstract GirlFriend create();}public class ChinaGirlFriendFactory extends GirlFriendFactory { @Override GirlFriend create() { return new ChinaGirlFriend(); }}public class KoreaGirlFriendFactory extends GirlFriendFactory { @Override GirlFriend create() { return new KoreaGirlFriend(); }}public class RussiaGirlFriendFactory extends GirlFriendFactory { @Override GirlFriend create() { return new RussiaGirlFriend(); }}public class JapanGirlFriendFactory extends GirlFriendFactory { @Override GirlFriend create() { return new JapanGirlFriend(); }}public class IrelandGirlFriendFactory extends GirlFriendFactory { @Override GirlFriend create() { return new IrelandGirlFriend(); }}public class TheCodersWorld { // 我是1024 我无所不能 我的世界我做主 public static void main(String[] args) { // 中国女朋友 GirlFriend girlFriend = new ChinaGirlFriend(); girlFriend.say(); // 韩国女朋友 GirlFriend girlFriend2 = new KoreaGirlFriend(); girlFriend2.say(); // 俄罗斯女朋友 GirlFriend girlFriend3 = new RussiaGirlFriend(); girlFriend3.say(); // 日本女朋友 GirlFriend girlFriend4 = new JapanGirlFriend(); girlFriend4.say(); // 爱尔兰女朋友 GirlFriend girlFriend5 = new IrelandGirlFriend(); girlFriend5.say(); }}根据需要建立一个抽象工厂GirlFriendFactory,并且扩展出不同国籍的子工厂,以后再有新增只需要建立对应的子工厂即可,满足了开闭原则。
经过一番改造,工厂负责人心满意足,不管 1024 后面有什么跟奇葩的要求,我们只需要新建子工厂即可,不需要改动之前的工厂。
工厂方法模式经过上面一系列的演变,我们大概知道简单工厂是一个工厂创建所有的产品,工厂方法模式是多个工厂分别生成对应的产品,那么下面回归到定义,进一步认识工厂方法模式。
通过上面得演变,大家应该知道在什么情况下从简单工厂升级为工厂方法模式了,另外大家需要牢记一下两点:
客户端不知道它所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。常见的工厂模式Java集合接口 Collection 中的工厂方法模式Logback 中的工厂方法模式码字挺辛苦,请大家留下宝贵的意见。欢迎转发,收藏。
做一个靠谱的程序员,与君共勉。
用于积累,用于分享。