【内容概览】
为什么需要设计模式
实战示例
1)什么是工厂方法模式
2)工厂方法模式的使用场景
3)工厂方法模式的实现方式
4)Go语言实战
5)工厂方法模式的优缺点
设计模式可以根据以前的实践和经验记录要采用的解决方案。
在设计模式的实现过程中,需要使用多个软件组件共同实现某些功能。
因此,设计模式加快了涉及多个组件的开发过程。
开发者可以在对应解决方案的具体应用中使用熟悉的编程语言。
例如,如果某个开发者熟悉Go语言,那么这个开发者可以使用Go语言开发相应的组件。
1)什么是工厂方法模式
工厂方法模式(Factory Method Pattern)定义了一个用于创建对象的接口,但让子类决定实例化哪个类。
接口中的工厂方法允许类将实例化操作推迟到一个或多个具体子类中。
工厂方法模式是创建对象的最佳方法之一,其中的对象创建逻辑对客户端隐藏。
根据上图可知,工厂方法模式的角色组成如下。
2)工厂方法模式的使用场景
3)工厂方法模式的实现方式
(1)定义工厂接口。
在工厂方法模式中,会在工厂接口中声明对所有产品都有意义的方法,示例代码如下:
(2)定义具体工厂类,并且实现工厂接口中的方法。
在具体工厂类的工厂方法中调用具体产品对象,并且返回具体产品对象。开发者可能需要在工厂方法中添加临时参数,用于控制返回的具体产品对象的类型。
(3)定义产品接口,并且定义该接口中的方法签名。
示例代码如下:
(4)定义具体产品类,并且实现产品接口中的方法。
示例代码如下:
(5)创建客户端,使用工厂生产产品。
示例代码如下:
4)Go语言实战
假设开发者正在开发一款服装工厂的品牌管理应用程序。
该应用程序的最初版本只能生产一种品牌ANTA的服装,因此大部分代码都在位于名为ANTA的类中。在一段时间后,工厂生产的这个品牌的服装质量很好,销量很高。工厂收到了很多其他公司的合作请求,希望工厂能够生产其他品牌的服装。
在应用程序中新增一个品牌类会遇到问题。如果其他代码与现有的类已经存在耦合关系,那么向应用程序中添加新类会比较麻烦。
目前,大部分代码都与ANTA类有关。如果要在应用程序中添加新的品牌类PEAK,则需要修改之前编写的大部分代码。
此外,如果开发者以后需要在程序中添加其他品牌类,则需要再次对代码进行大规模修改。
使用工厂方法模式可以解决上面的问题。工厂方法模式建议使用特殊的工厂方法调用对象,工厂方法返回的对象通常称为产品。
在工厂方法模式中,开发者可以在子类中重写工厂方法,从而改变其创建的产品类型。
所有产品都必须实现同一个接口。例如,PEAK类和ANTA类都必须实现服装产品接口IClothes,该接口中声明了方法GetName()和GetSize()。只要产品类实现一个共同的产品接口,开发者就可以将其对象传递给客户端,不需要提供其他数据。
客户端不需要了解不同子类返回的对象之间的差别。客户端将所有产品视为抽象的服装产品接口IClothes。客户端知道所有服装品牌对象都有其相应的方法,无须关心服装品牌对象的具体实现方式。
由于Go语言中缺少类和继承等面向对象编程的特性,因此无法使用Go语言实现经典的工厂方法模式。不过,开发者仍然可以实现工厂方法模式的基础版本,即简单工厂。在本实战中,开发者会使用服装工厂类生产多种品牌的服装。
首先,创建一个名为IClothes的接口,在该接口中定义生产一套服装所需的所有方法;然后,创建实现IClothes接口的服装产品类clothes。
有两种具体的服装产品类,分别是ANTA类与PEAK类,二者都嵌入了clothes类,并且间接实现了IClothes接口中的所有方法。
服装工厂类ClothesFactory会发挥工厂的作用,即通过传入参数生产所需类型的服装。main.go文件会扮演客户端的角色,它不会直接与ANTA类或PEAK类进行互动,而是依靠ClothesFactory类创建多种服装产品对象,仅使用字符参数控制生产。
(1)定义服装产品接口IClothes,该接口中有两个私有方法——setName()和setSize(),以及两个公共方法——GetName()和GetSize(),代码如下:
(2)定义服装产品类clothes及其方法,该类会被嵌套进PEAK、ANTA等具体品牌类,代码如下:
(4)定义具体服装产品类ANTA及其初始化函数,代码如下:
(5)编写MakeClothes()函数,该函数会根据实参类型生产不同品牌的服装,代码如下:
(6)创建客户端,测试工厂方法模式,代码如下:
5)工厂方法模式的优缺点
优点:
缺点:
以上节选自《Go语言设计模式》一书。
本书聚焦于Go语言设计模式的知识与应用。
全书共6章,分别为设计模式入门、创建型设计模式、结构型设计模式、行为型设计模式、设计模式扩展、设计模式与软件架构。
本书简洁而不失技术深度,内容覆盖Go语言的主流设计模式和软件架构,以极简的文字介绍了复杂的案例,是学习Go语言设计模式和软件架构的实用教程。
该书已经出版发行,并给大家申请到五折优惠,感兴趣的读者朋友欢迎通过如下方式购买。