首页 > 其他分享 >设计模式之(6)——建造者模式

设计模式之(6)——建造者模式

时间:2022-09-01 11:27:06浏览次数:49  
标签:Product Description Title builder 建造 模式 设计模式 public

  定义:建造者模式也称为生成器模式,将一个个简单对象一步步构造成一个复杂的对象,将复杂对象的构建和它的表示分离,使得同样的构建过程有不同的表示;

  主要解决:系统中复杂对象的创建过程,通常由各个部分的子对象采用一定的算法构成;由于需求的变化 ,这个复杂对象的各个部分通常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定;

  何时使用:一些基本部件不变,而其组合经常变化的时候;

  如何解决:将变与不变相分离;

   模式结构(PS:本图是从网上找过来的):

  

  模式角色分析:

    1、产品类:是一个较为复杂的对象,这个对象的创建过程较为复杂,实际编程中可以由一个抽象类和它的不同实现组成,也可以由抽象类与他们的实现组成;

    2、抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交给它的子类来实现,这样更容易扩展,同时也符合面向接口编程的出发点,一般包含两个抽象方法,一个用来建造产品,一个用来返回产品;

    3、建造者:实现抽象类所有未实现的方法,组件产品,返回组装好的产品;

    4、指挥类:负责调用适当的建造者来组建产品,指挥类一般不与产品类发生依赖关系,与指挥类直接交互的是建造者类,一般来说指挥类被用来封装程序中易变的部分;

  应用场景:

  1、创建复杂对象的算法独立于组成对象的部件;

  2、肯德基的汉堡、可乐、薯条、炸鸡等是不变的,而其组合是经常变化的,将不同的产品组合在一起,生成出来所谓的“套餐”;

  3、jdk中的StringBuilder类;

  4、同一个创建过程需要有不同的内部属性的产品对象,例如建造房子,利用沙子、水泥、钢筋既可以建造别墅也可以建造普通楼房;

  优点:

  1、客户端不必知道产品组成的细节,将产品本身与产品的创建过程,使得相同的创建过程可以创建不同的产品对象;

  2、每个具体建造者都独立,因此可以方便地更换、或者增加具体的建造者,用户使用不同的具体建造者可以得到不同的产品对象;

  3、可以更精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰;

  4、增加新的具体的建造者不需要修改原来类库的代码,指挥类针对抽象建造者类编程,系统方便扩展,符合“开闭原则”;

  缺点:

  1、建造者过多时,会产生很多类,难以维护;

  2、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,若产品之间的差异性很大,则不适合使用该模式,使用范围受限;

  工厂模式和建造者模式联系和区别:

  工厂模式重点关注如何获取实例对象,而建造者模式重点关注如何建造实例对象;建造者模式和工厂模式从总体上看仅仅是多了一个“指挥类”的角色,如果将“指挥类”看做是最终调用的客户端,那么剩余部分就可以看做是一个简单的工厂模式了,工厂模式是将实例对象的建造过程封装在工厂中了,工厂直接返回实例对象给调用者,而建造者模式是将实例对象的建造过程封装在了具体的建造者类中,由“指挥类”调用,返回对象给客户端调用;

  UML类图:

  

  示例代码:

package cn.com.pep.model.builder.builder2;
/**
 * 
 * @Title: Builder  
 * @Description:  抽象建造者
 * @author wwh 
 * @date 2022-9-1 9:56:08
 */
public abstract class Builder {
    
    /**
     * 
     * @Title: builderPartA 
     * @Description:
     */
    public abstract void builderPartA();
    
    /**
     * 
     * @Title: builderPartB 
     * @Description:
     */
    public abstract void builderPartB();
    
    /**
     * 
     * @Title: getProduct 
     * @Description:  
     * @return
     */
    public abstract Product getProduct();
}

 

package cn.com.pep.model.builder.builder2;
/**
 * 
 * @Title: ConcreteBuilderA  
 * @Description:  具体建造者A
 * @author wwh 
 * @date 2022-9-1 10:00:40
 */
public class ConcreteBuilderA extends Builder{
    
    private Product product = new Product();

    @Override
    public void builderPartA() {
        product.addPart("VegetableBurger");
    }

    @Override
    public void builderPartB() {
        product.addPart("Cocacola");
    }

    @Override
    public Product getProduct() {
        return product;
    }

    
}
package cn.com.pep.model.builder.builder2;
/**
 * 
 * @Title: ConcreteBuilderB  
 * @Description:  具体建造者B
 * @author wwh 
 * @date 2022-9-1 10:04:48
 */
public class ConcreteBuilderB extends Builder{
    
    private Product product = new Product();

    @Override
    public void builderPartA() {
        // TODO Auto-generated method stub
        product.addPart("ChickenBurger");
    }

    @Override
    public void builderPartB() {
        // TODO Auto-generated method stub
        product.addPart("Pepsi");
    }

    @Override
    public Product getProduct() {
        // TODO Auto-generated method stub
        return product;
    }

}
package cn.com.pep.model.builder.builder2;

/**
 * 
 * @Title: Product  
 * @Description:  
 * @author wwh 
 * @date 2022-9-1 9:50:03
 */

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * 
 * @Title: Product  
 * @Description:  产品类
 * @author wwh 
 * @date 2022-9-1 9:55:50
 */
public class Product {

    List<String> parts = new ArrayList<>();

    /**
     * 
     * @Title: addPart
     * @Description: 添加产品部件
     * @param part
     */
    public void addPart(String part) {
        parts.add(part);
    }

    /**
     * 
     * @Title: show
     * @Description:显示产品细节
     */
    public void show() {
        Iterator<String> it = parts.iterator();
        while (it.hasNext()) {
            String string = (String) it.next();
            System.err.println(string);
        }
    }

}
package cn.com.pep.model.builder.builder2;
/**
 * 
 * @Title: Director  
 * @Description:  指挥者类
 * @author wwh 
 * @date 2022-9-1 10:12:05
 */
public class Director {
    
    /**
     * 
     * @Title: creatProduct 
     * @Description:  
     * @param builder
     */
    public void creatProduct(Builder builder) {
        builder.builderPartA();
        builder.builderPartB();
    }
}
package cn.com.pep.model.builder.builder2;
/**
 * 
 * @Title: BuilderPatternDemo  
 * @Description:  测试类
 * @author wwh 
 * @date 2022-9-1 10:13:51
 */
public class BuilderPatternDemo {
    
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilderA();
        Director director = new Director();
        director.creatProduct(builder);
        Product p = builder.getProduct();
        p.show();
        
        builder = new ConcreteBuilderB();
        director.creatProduct(builder);
        p = builder.getProduct();
        p.show();
        
    }
}

标签:Product,Description,Title,builder,建造,模式,设计模式,public
From: https://www.cnblogs.com/wha6239/p/16643030.html

相关文章

  • 单例模式模板
    #include<bits/stdc++.h>usingnamespacestd;template<typenameT>classSingleton{public:staticT*instance(){staticT*instance=new......
  • 设计模式之单例模式(Python实现)
    先认识下什么是单例模式,可以参考前人的优秀分析https://blog.csdn.net/lovelion/article/details/9319181总结起来说,当我们在代码中频繁的创建和删除对象时会消耗大量资源......
  • 初识设计模式 - 建造者模式
    简介概念建造者设计模式(BuilderDesignPattern)又叫作生成器模式,是一种对象构建模式,其核心在于将产品和产品建造过程解耦。建设者模式允许用户只通过指定复杂对象的类型......
  • 设计模式 引子
       设计模式的世界丰富多彩,比如生产一个个“产品”的工厂模式,衔接两个不相关接口的适配器模式,用不同的方式做同一件事情的策略模式,构建步骤稳定,根据不同配置构造稳定......
  • 设计模式之(5)——原型模式
    上篇文章中我们提到单例模式可以避免重复创建消耗资源的对象,但是却不得不共用对象。若是对象本身也不让随意访问修改时,怎么办?那么我们就可以采用原型模式来创建新的实......
  • C++ 简单设计模式之简单工厂
    一、简单工厂一个工厂类能够根据传入参数而决定创建出哪一种产品类的实例二、类设计//手机classPhone{public: virtualvoidmodel()=0;};//华为手机clas......
  • 【设计模式】25.行为型模式-解释器(Interpreter)
    一、描述给定一个语言,定义它的文法的一种标识,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式为自定义语言的设计和实现提供了一种解决方案,它用......
  • 2022 年 8 月前端更新:TypeScript、软件设计模式、焦点样式和单个 CSS 转换属性中的 SO
    2022年8月前端更新:TypeScript、软件设计模式、焦点样式和单个CSS转换属性中的SOLID原则本月我们将介绍TypeScript中的SOLID原则、React应用程序的软件设计模......
  • 模板、策略以及工厂模式
    记录学习过程中的问题,实操总结,方便回顾。模板方法属于行为设计模式;在父类中定义一个算法的框架,允许子类在不修改结果的情况下重写算法的特定步骤。应用场景:当多个产......
  • 静态——字段与属性、方法与类、单例设计模式
    1、static关键字static关键字,用于修饰类,字段,属性,方法,构造方法等。被static修饰的类称之为“静态类”;被static修饰的成员称之为“静态成员”;被修饰过的成员分别称为:......