生成器模式 创建型模式

本文深入解析建造者模式的原理及应用场景,通过实例演示如何利用该模式简化复杂对象的创建过程,提高代码灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接1)生成器模式:将复杂对象的表示和创建进行分离。

抽象工厂和工厂模式,都是进行完成一个或是一系列的对象创建,如果是针对一个对象的创建较为复杂,需要多部分组装。

此时需要用建造者模式。

2)一个对象有多个部分进行构建,构建算法按需求变化,每一个构建模块相对稳定。

此时,生成器模式可以达到封装,让内部变化,而对外不影响。

3)构建图:


1、抽象生成器(builder):为创建一个Product对象的各个部件指定的抽象接口。

2、生成器具体实现

3、指导者

4、产品

5、客户端




代码案例:

:  public abstract class Builder{
 2:      public abstract void buildPartA();
 3:      public abstract void buildPartB();
 4:      public abstract Product getProduct();
 5:  }
 6:   
 7:  public class ConcreteBuilder1 extends Builder{
 8:      private Product product;
 9:      public void buildPartA(){
10:          product.addPart("PartA");
11:      }
12:      public void buildPartB(){
13:          product.addPart("PartB");
14:      }
15:   
16:      public Product getProduct(){
17:          if(product!=null)
18:              return product;
19:          else 
20:              return null;
21:      }
22:  }
23:   
24:  public class ConcreteBuilder2 extends Builder{
25:      private Product product;
26:      public void buildPartA(){
27:          product.addPart("PartX");
28:      }
29:      public void buildPartB(){
30:          product.addPart("PartY");
31:      }
32:   
33:      public Product getProduct(){
34:          if(product!=null)
35:              return product;
36:          else 
37:              return null;
38:      }
39:  }
40:   
41:  public class Director{
42:      public void construct(Builder builder){
43:          builder.buildPartA();
44:          builder.buildPartB();
45:      }
46:  }
47:   
48:  public class Product{
49:      private ArrayList<String> product;
50:      public void addPart(String partName){
51:          product.add(partName);
52:      }
53:   
54:      public void showProduct(){
55:          for (String part : product) {
56:              System.out.println(part);
57:          }
58:      }
59:   
60:  }
61:   
62:  public class Client{
63:      public static void main(String[] args){
64:          Director director=new Director();
65:   
66:          Builder concreteBuilder1=new ConcreteBuilder1();
67:          director.construct(concreteBuilder1);
68:          Product product1=concreteBuilder1.getProduct();
69:          product1.showProduct();
70:   
71:          Builder concreteBuilder2=new ConcreteBuilder2();
72:          director.construct(concreteBuilder2);
73:          Product product2=concreteBuilder2.getProduct();
74:          product2.showProduct();        
75:      }
76:  }


现实场景



其实,在现实场景中,有很多适用于生成器模式来解决的应用。比如Terrylee所描述的 KFC场景 ,这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。 这些在不同的儿童餐中可以是不同的 ,但是 组合成儿童餐的过程是相同的 (这是关键点)。无论顾客点的是汉堡,三名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争的餐馆中是同样的。在这样一种场景中,主食、辅食、饮料和玩具根据所选择的套餐种类的不同而不同,但是不管何种套餐,都具有这几大部分,也就是说组装的过程是一致的,不同的只是子部分的实现不同而已,但是这并不妨碍子部分的组装流程。这不完全符合生成器模式的适用场景吗?


在生成器模式中,我们不轻易改变的是面向客户的那一个Director ,而是来实现不同的ConcreteBuilder 

比如儿童餐,有主食, 菜, 汤,玩具,那么在主食中,可以有米饭,馒头,菜品:蔬菜,红烧肉,汤:蛋花汤,等

这样就给出多个实现 ConcreteBuilder的实现,此时面向客户端的就不变了。 

这里不进行扩展,客户端点不同的套餐的情况。仅仅是进行扩展固定的一个主食,一个菜品,一个汤的情况!


总结: 对象的表示也可以抽象为总体的行为。或是创建也可以抽象成表示。也就是将复杂对象的行为分层,或表示分层。

行为 就是表示! 将复杂对象分层创建。


 

参考:点击打开链接https://www.cnblogs.com/JackyTecblog/archive/2012/09/20/2695429.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值