通过前面4篇设计模式的学习,我们可以发现一个共同点就是,把具体类抽象,然后通过接口来指向对象实例,像下面这样
IInterface I = new ConcreteClass();
这样的编写风格,我们确实是通过接口让代码变的更有弹性,但是,存在一个问题就是在应用类中我们依然new了一另一个对象的实例,当我们需要变更这个具体的对象类是,还是需要修改我们的应用类。似乎并不是完全的对修改关闭。
今天我们来了解一个新的设计方法,这种设计方式可以让我们把实例化具体类的代码从应用类中抽离出来。当实体类需要更改时,就不需要改动我们的应用类。
1:什么是简单工厂模式
定义:通过定义一个工厂类,来让这个工厂类专门生产具体类实例,并且返回这个类的接口或父类
场景:我们每年都要过中秋节,每次过节都会买各种口味的月饼,有伍仁味,牛肉,火腿等,月饼店就要按照订单来生产相关的月饼
2:实现上述场景
1:我们先按照以前的代码风格来实现
分析:为了让月饼店和月饼之间解耦,我们先定义一个月饼的接口(IMoonCake),让具体的月饼实现这个接口 ,再定义一个月饼的类(MoonCakeStore)并让其维护一个月饼的接口 。
第一步:建立月饼接口:
第二步:创建三种口味的,具体月饼
第三步: 创建月饼的零售店
在上面的实现上,似乎解了月饼和月饼店的之间的耦合,但是对于MoonCakeStore这个类并没有满足对修改关闭这个原则,因为当我们添加或者删除一中口味的月饼时就需要去修改MoonCakeStore类中的switch代码块,
为了满足“对修改关闭这个原则”,下面我们添加一个工厂专门用来生产月饼,把Switch这段代码从Store中分离出来,以后添加或删除月饼类型时就只需要修改Factory类。
2:建立一个简单的月饼工厂
第一步:建立工厂类
第二步:修改月饼的零售店类
通过第2种方式,我们就将月饼的实例化从应用中抽离出来,
Factory:是用来生产月饼,也就是实例化具体类的功能
IMoonCake:月饼类的接口,使用接口返回,让代码更具有弹性
MoonCakeStore:工厂的客户,通过工厂来取得具体的月饼实例,完成月饼的制作
通过这篇简单工厂的热身让我们对使用工厂这种编程习惯(把经常发生变动的部分抽离出来,单独封装)有一个简单的认识,下一篇我们来进一步学习工厂模式之工厂方法模式