二十三种设计模式之生成器模式

Posted ycbest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二十三种设计模式之生成器模式相关的知识,希望对你有一定的参考价值。

一、简介

生成器模式是一种创建型设计模式,它把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。

以我的理解看,生成器模式中的生成器被用来对生成对象的组成部分进行控制,比如要产生一辆汽车(最终对象),那么玻璃是用普通玻璃还是防弹玻璃(生成最终对象的一个步骤)。而指导类主要用来设置各个步骤之间的次序与取舍,比如先安装门还是先安装玻璃,要不要安装座垫加热。

二、何时使用生成器模式

1、需要创建涉及各种部件的复杂对象。创建对象的算法应该独立于部件的装配方式。常见例子是构建组合对象
2、构建过程需要以不同的方式(例如,部件或表现的不同组合)构建对象

 

二、生成器模式与抽象工厂模式的区别

生成器模式与抽象工厂模式看起来很像,其实有很多不同。首先抽象工厂模式更注重于“系列”,即要创建的产品族分为不同的系列,比如是奥迪的车,还是宝马的车,同一系列中的产品是固定的,创建的步骤也是固定的。而生成器模式的重点在于对创建过程中每一个步骤的精细控制以及步骤间次序的控制,比如先组装轮胎(组装什么样的轮胎) 还时先做玻璃(组装什么样的玻璃),这些在抽象工厂模式中是不方便进行控制的(甚至需要修改或创建新的工厂抽象类)。

 

生成器模式:
构建复杂对象
以多个步骤构建对象
以多种方式构建对象
在构建过程的最后一步返回产品
专注一个特定产品

工厂模式:
构建简单或复杂对象
以单一步骤构建对象
以单一方式构建对象
立刻返回产品
强调一套产品

三、实例

下面以一辆汽车的生产为例。

首先是汽车类:

 1 interface CarPlan {
 2     void setWheel(String wheel);
 3     void setFrame(String frame);
 4     void setEngine(String engine);
 5     void setWidget(String widget);
 6 }
 7 
 8 class Car implements CarPlan {
 9     private String myWheel;
10     private String myFrame;
11     private String myEngine;
12     private String myWidget;
13     void setWheel(String wheel) {
14         myWheel = wheel;
15     }
16     void setFrame(String frame) {
17         myFrame = frame;
18     }
19     void setEngine(String engine) {
20         myEngine = engine;
21     }
22     void setWidget(String widget) {
23         myWidget = widgetl
24     }
25 }

然后创建生成器:

 1 interface Builder {
 2     void buildWheel();
 3     void buildFrame();
 4     void buildEngine();
 5     void buildWidget();
 6     Car getCar();
 7 }
 8 //一个廉价车生成器
 9 class CheapBuilder implements Builder {
10     Car cheapCar = new Car();
11     Car getCar() {
12         return cheapCar;
13     }
14     void buildWheel() {
15         cheapCar.setWheel("cheap wheel");
16     }
17     void buildFrame() {
18         cheapCar.setFrame("cheap frame");
19     }
20     void buildEngine() {
21         cheapCar.setEngine("cheap engine");
22     }
23     void buildWidget() {
24         cheapCar.setWidget("no widget");
25     }
26 }
27 //一个平价车生成器
28 class EconomicBuilder implements Builder {
29     Car economicCar = new Car();
30     Car getCar() {
31         return economicCar;
32     }
33     void buildWheel() {
34         cheapCar.setWheel("cheap wheel");
35     }
36     void buildFrame() {
37         cheapCar.setFrame("expensive frame");
38     }
39     void buildEngine() {
40         cheapCar.setEngine("cheap engine");
41     }
42     void buildWidget() {
43         cheapCar.setWidget("economic widget");
44     }
45 }

创建指导类:

 1 class Director {
 2     private Builder builder;
 3     director(Builder bld) {
 4         builder = bld;
 5     }
 6     void produceCar() {
 7         //这里对步骤进行控制
 8         builder.buildFrame();
 9         builder.buildWidget();
10         builder.buildWheel();
11         builder.buildEngine();
12     }
13     Car getCar() {
14         builder.getCar();
15     }
16 }

客户端使用:

1 public class Test {
2     public static void main(String[] args) {
3         Builder bld = new EconomicBuilder();
4         Director director = new Director(bld);
5         director.produceCar();
6         Car car = director.getCar();
7 }

 

参考:
————————————————
版权声明:本文为CSDN博主「jlu16」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jlu16/article/details/82685265


作者:liyoucheng2014
链接:https://www.jianshu.com/p/d62f7c44081b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于二十三种设计模式之生成器模式的主要内容,如果未能解决你的问题,请参考以下文章

二十三种设计模式[3] - 生成器(Builder)

二十三种设计模式之装饰器模式

二十三种设计模式

二十三种设计模式

二十三种设计模式[20] - 状态模式(State Pattern)

二十三种设计模式[12] - 代理模式(Proxy Pattern)