文章目录
一、问题导入
之前介绍了简单工厂模式,发现简单工厂模式违背了开闭原则,就是在工厂类中存在一个静态的方法,并且是由这个静态的方法去创建所有的子类产品对象。
当增加一个新的产品时,要打开源代码修改,增加一条 if 语句。现在针对这个问题,学习工厂放方法模式。
二、工厂方法模式
1.类图
2.类图分析
(1)工厂方法模式与简单工厂方法模式的区别主要在:
工厂方法模式增加了一个工厂接口。也就是工厂方法模式让每一个具体的产品由一个对应的工厂去生产,将产品分类,一个工厂生产一类。而简单工厂方法模式就是不分类,都放在一起生成。
(2)如何实现将产品分类呢,在工厂类中增加抽象的工厂接口,生产一种具体的产品就去继承一个具体子类工厂。比如A工厂生产A类产品。
三、工厂方法模式修改汽车保险条款例子
1.结构
2.代码实现
2.1 产品层次
(1)抽象产品类,里面有一个抽象方法,用于描述产品。
(2)具体产品继承抽象产品类,并实现抽象方法。
2.2 工厂层次
(1)将生成产品的工厂抽象化,抽象的工厂里面有一个抽象的方法,该方法用于创建创建产品对象。当有要生成的新品种产品时,就继承抽象工厂,得到一个具体的工厂去生产。
(2)有新的产品要生产,继承抽象工厂,并且实现抽象方法。得到具体的工厂,这个工厂用于创建人身类保险,然后返回人身保险类型对象。
2.3 客户端层次
客户端如何去使用?
(1)让客户选择保险类型
(2)根据客户的选择保险类型,选择对应的生成工厂
(3)得到对应的保险类型的对象,使用对象
记住,要用抽象类工厂去存放具体工厂,这样就比较灵活。因为父类的变量可以存放子类的变量,而一开始不知道子类的类型是什么,也就是不知道工厂的类型。
要用抽象的保险类型变量存放具体保险类型对象。总之,变量的类型尽量要声明为抽象的变量类型,也就是父类的变量类型。
3.得到启示
会发现,工厂方法模式,将生成的产品分类了,每一种类型交给一个工厂去生成。这样满足了类的单一职责原则,同时也将大量的 if 语句去掉了,所以说:
当程序中出现大量的 if 语句,可以考虑是否可以用工厂方法模式去修改优化。
四、简单工厂方法模式与工厂方法模式的比较
1.简单工厂方法模式
一个工厂生成所有类型的产品。
2.工厂方法模式
(1)将工厂分类,生产不同类型的产品。这也符合了开闭原则、依赖倒置原则,高层依赖于抽象,细节的实现也依赖于抽象。
(2)工厂层次和产品层次满足了开闭原则,但是客户端现在还没有满足。当增加了新的类型,客户端就要修改源代码,增加 if 语句。
五、何时使用工厂方法模式
(1)依赖于用户的输入
(2)
(3)比如一个产品如何创建,只想让一个工厂知道。
(4)简单来说就是要生产多种产品,或者代码中有多种选择可以考虑工厂方法模式。
六、工厂方法模式设计方面的几种考虑
意思就是将所有子类的共性东西抽象出来,放在父类中;不方便的超类中包含的方法,不是共性(也就是个性化的)的放在子类中。
所以工厂方法模式的目的就是让客户拿到产品之后,只知道这是一个产品,具体是哪种产品不需要知道,因此在客户端中只能调用产品层次中抽象的、公共的方法。就像去买一辆车,客户不必要知道车是怎么做的。