工厂方法模式+抽象工厂模式+建造者模式
工厂方法模式
工厂方法模式的定义
- 定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的创建与使用相分离的特点。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”
结构图
工厂方法模式的主要角色
1)抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法newProduct()来创建产品。
2)具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
4)具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
工厂方法模式通常适用以下场景
-
客户只知道创建产品的工厂名,而不知道具体的产品名。如:TCL电视工厂、海信电视工厂等;
-
创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。**
-
客户不关心创建产品的细节,只关心产品的品牌。
抽象工厂模式
抽象工厂模式的定义
- 定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
结构图
抽象工厂模式的主要角色有:
-
抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法newProduct(),可以创建多个不同等级的产品。
-
具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
-
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
-
具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
抽象工厂模式通常适用以下场景
-
当需要创建的对象是一系列相互关联或相互依赖的产品族时,如:电器工厂中的电视机、洗衣机、空调等。
-
系统中有多个产品族,但每次只使用其中的某一族产品。如:有的粉丝只喜欢穿李宁牌的衣、裤和鞋。
-
系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
博主见解
-
工厂方法模式适用于单一产品。例如:利用工厂方法模式设计畜牧场,养马场和养牛场只能养殖对应的物种。相较于抽象工厂模式,工厂方法模式只有一种产品接口。
-
抽象工厂模式适用于多样化产品。例如:用抽象工厂模式设计畜牧场,实现类SRfarm和SGfarm都可以同时生产畜牧和植物。相较于工厂方法模式,抽象工厂模式将相同的产品簇抽象为一个接口。
-
当工厂方法模式的产品增加(例如养马场中种植蔬菜,输出的具体产品就有马和蔬菜),工厂方法模式就转为抽象工厂模式。
建造者模式(Builder)
建造者模式的定义
- 定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。
结构图
建造者的结构
-
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个组成部件。
-
抽象建造者(Builder):是一个包含创建产品各个子部件的抽象方法的接口,它通常还包含一个返回复杂产品的方法getResult()。
-
具体建造者(ConcreteBuilder):实现了Builder接口,完成复杂产品的各个部件的具体创建方法。
-
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
使用场景
-
创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
-
创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。
博主见解
- 指挥者就像是小米的创始人雷军负责统筹全局。
- 抽象建造者是小米旗下的手机开发管理员
- 具体建造者就像是小米手机的生产工厂
- 产品就是小米手机
- 产品归属于抽象建造者管理,即小米手机的产出权限归属于开发管理员
- 具体建造者和抽象建造者的关系是关联关系。相当于开发管理员说:”A你做屏幕,B你做电池,C你去把他们组装起来。“
- 抽象建造者很厉害,但是也归属于指挥者。比如雷某可以对小米手机开发管理员说:“你不要做手机了,改做平板吧。”
(注:资料转载于《软件设计模式(Java版)》作者:程细柱 除博主见解外,其余都是资料,包括所有的图片)
(博主见解可能会有失误,欢迎各位指正、讨论)