博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成器模式
阅读量:4180 次
发布时间:2019-05-26

本文共 2577 字,大约阅读时间需要 8 分钟。

生成器模式(Builder Pattern),也称建造者模式,属于构造型模式的一种。

定义

将一个复杂的对象的构建(builder)和它的表示(director)分离,使得同样的构建过程可以创建不同的表示。核心是给指导者一个生成器,但具体方式不指定。

类图及组成角色

在这里插入图片描述

四种角色(5种包括客户端):

产品(Product):具体生产器要构造的复杂对象,它的各个组成部分由ConcreteBuilder生成,生成过程由Director(指导类)控制。注意该类中只提供了get方法,这个看具体需求。

抽象生成器(Builder):声明了生成器应包含的创建产品各个组成部件的方法。注意,这些方法只是生成对象的各组成部分,各方法相互独立,方法间无时序关系,也不存在“总”的生成方法。另外,Builder应包含获取生成的产品的方法。

具体生产器(ConcreteProduct):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法;每种不同的产品都有一个专属的ConcreteBuilder。

指导类(Director):用于控制产品的生成过程。Director的控制对象是Builder,即通过Director实现了对各类型产品的生成过程的重用。

客户端(Client):是生成器模式的使用者。对Client来说,生成的最终产品Product的类型是明确的,生成Product所使用的具体生成器ConcreteBuilder也是明确的。

优点
  1. 将复杂对象的构建和表示进行解耦,用户无需了解对象的具体组件,对象创建具有更大的灵活性。
  2. 可以更加精细有效地控制对象的构造过程。
  3. 满足开-闭原则:当增加新的具体生成器时,不必修改指挥者的代码。
应用
  1. 当系统创建结构复杂的对象时,对象的组成和装配方式须分离,构造方法中编写的对象无法分离。
  2. 构造过程必须允许被构造对象有不同表示时。
案例代码
//抽象类或接口public abstract class Builder {
public abstract void buildPartA(); public abstract void buildPartB(); public abstract Product getBuildResult(); }//指挥者类,用来指挥建造过程public class Director {
public void construct(Builder builder) {
builder.buildPartA(); builder.buildPartB(); }}//具体建造者类public class ConcreteBuilder1 extends Builder {
private Product product = new Product(); @Override public void buildPartA() {
product.add("部件A"); } @Override public void buildPartB() {
product.add("部件B"); } @Override public Product getBuildResult() {
return product; }}// 具体建造者类,建造的对象时Product,通过build使Product完善public class ConcreteBuilder2 extends Builder {
private Product product = new Product(); @Override public void buildPartA() {
product.add("部件X"); } @Override public void buildPartB() {
product.add("部件Y"); } @Override public Product getBuildResult() {
return product; }}//产品类,由多个部件组成public class Product {
List
parts = new ArrayList
(); // 添加产品部件 public void add(String part) {
parts.add(part); } // 列举所有的产品部件 public void show() {
System.out.println("---产品 创建---"); for (String part : parts) {
System.out.println(part); } }}//建造客户端public class BuilderClient {
public static void main(String[] args) {
Director director = new Director(); Builder builder1 = new ConcreteBuilder1(); Builder builder2 = new ConcreteBuilder2(); director.construct(builder1); Product product1 = builder1.getBuildResult(); product1.show(); director.construct(builder2); Product product2 = builder2.getBuildResult(); product2.show(); }}

上一篇:

下一篇:

转载地址:http://hlrai.baihongyu.com/

你可能感兴趣的文章
17 张程序员壁纸(使用频率很高)
查看>>
送一台全新手机,手慢无~
查看>>
全球顶级的14位程序员!膜拜!
查看>>
太赛博朋克!华为天才少年自制B站百大Up奖杯,网友:技术难度不高,侮辱性极强...
查看>>
华为正式宣布养猪,网友沸腾:支持华为自救!
查看>>
真的有必要读研究生吗?
查看>>
一个员工的离职成本到底有多恐怖!
查看>>
微软骂人:请勿TM关闭......
查看>>
B站python+数据分析精华汇总!速领,免费,一会删!
查看>>
一个中科大差生的8年程序员工作总结
查看>>
新功能!微信可以开“小号”了
查看>>
墙裂推荐!一款 VM 大规模集群管理工具
查看>>
知乎万赞:计算机应届生月薪大多是多少?
查看>>
试用期没过,因在公司上了1024网站...
查看>>
终于有人把如何精通C++讲明白了!
查看>>
我的天!史上最强的摸鱼网站!!!
查看>>
新款电脑,真香啊!!!
查看>>
为什么我劝你不要太把领导当回事?
查看>>
牛逼至极!用这个神器看代码太舒服了
查看>>
信息量过大,8h删!
查看>>