冲击50W年薪系列设计模式工厂模式

学习的脚步不能停。。。

上一篇 简单工厂模式 中我们无所不能的 1024 从一个单身狗华丽丽的转变成了亿万男同胞心中的偶(渣)像(男),1024 开始膨胀了,想着古代皇帝可以后宫佳丽三千,我要我的时间除了我就是佳丽,他骄傲了,因为他无所不能嘛,你不断的给工厂传达指令,俄罗斯的,爱尔兰的,日本的。。。

累死工厂建后宫

public class RussiaGirlFriend extends GirlFriend { @Override protected void say() { System.out.println("Здравствыйте, 1024!"); }}public class JapanGirlFriend extends GirlFriend { @Override protected void say() { System.out.println("こんにちは, 1024!"); }}public class IrelandGirlFriend extends GirlFriend { @Override protected void say() { System.out.println("Hello, 1024!"); }}@AllArgsConstructorpublic enum GirlFriendNationality { CHINA(1,"中国"), KOREA(2,"韩国"), RUSSIA(3,"俄罗斯"), JAPAN(4,"日本"), IRELAND(5,"爱尔兰"); int code; String message;}public class GirlFriendFactory { public static GirlFriend create(GirlFriendNationality nationality){ GirlFriend girlFriend; switch (nationality){ case KOREA: girlFriend = new KoreaGirlFriend(); break; case JAPAN: girlFriend = new JapanGirlFriend(); break; case RUSSIA: girlFriend = new RussiaGirlFriend(); break; case IRELAND: girlFriend = new IrelandGirlFriend(); break; default: girlFriend = new ChinaGirlFriend(); } return girlFriend; }}public class TheCodersWorld { // 我是1024 我无所不能 我的世界我做主 public static void main(String[] args) { // 中国女朋友 GirlFriend girlFriend = GirlFriendFactory.create(GirlFriendNationality.CHINA); girlFriend.say(); // 韩国女朋友 GirlFriend girlFriend2 = GirlFriendFactory.create(GirlFriendNationality.KOREA); girlFriend2.say(); // 俄罗斯女朋友 GirlFriend girlFriend3 = GirlFriendFactory.create(GirlFriendNationality.RUSSIA); girlFriend3.say(); // 日本女朋友 GirlFriend girlFriend4 = GirlFriendFactory.create(GirlFriendNationality.JAPAN); girlFriend4.say(); // 爱尔兰女朋友 GirlFriend girlFriend5 = GirlFriendFactory.create(GirlFriendNationality.IRELAND); girlFriend5.say(); }}

分别添加三个类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 中的工厂方法模式

码字挺辛苦,请大家留下宝贵的意见。欢迎转发,收藏。

做一个靠谱的程序员,与君共勉。

用于积累,用于分享。

上一篇: 女销售原来靠这样卖房(楼盘置业顾问提成大概多少)
下一篇: 高铁座位有abcdf 为什么没有e,高铁二等座怎么找座位