zoukankan      html  css  js  c++  java
  • 建造者模式

    建造者模式(Builder Pattern)

    定义:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

    介绍

    意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

    主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

    ● Product产品类

    通常是实现了模板方法模式,也就是有模板方法和基本方法,例子中的BenzModel和BMWModel就属于产品类。

    ● Builder抽象建造者

    规范产品的组建,一般是由子类实现。例子中的CarBuilder就属于抽象建造者。

    ● ConcreteBuilder具体建造者

    实现抽象类定义的所有方法,并且返回一个组建好的对象。例子中的BenzBuilder和BMWBuilder就属于具体建造者。

    ● Director导演类

    负责安排已有模块的顺序,然后告诉Builder开始建造

    建造者(Builder)模式的主要角色如下。

    1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
    2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
    3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
    4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

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

    如何解决:将变与不变分离开。

    关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

    应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

    优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

    缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

    使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

    ● 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。

    ● 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

    ● 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。

    注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

    实现

    步骤 1(产品角色)

    /*
    产品类
    
     */
    //建造者模式
    public class Product {
    
    
      private String cpu;
      private String memory;
    
    
    
    }
    

    步骤 2(抽象建造者(Builder))

    /*
    抽象建造类
     */
    public  abstract   class Builder  {
    
        protected  Product product=new Product();
    
        public abstract void buildCPU();
        public Product  CreateProduct() {
            return product;
        }
    }
    

    步骤 3 ConcerteBuilder类——具体建造者类 ConcerteBuilder2类——具体建造者类(具体建造者(Concrete Builder))

    /*
    ConcerteBuilder类——具体建造者类
     */
    public class ConcreteBuilder extends Builder {
        @Override
        public void buildCPU() {
    
            System.out.println("i5");
        }
    }
    
    /*
    ConcerteBuilder2类——具体建造者类
     */
    public class ConcreteBuilder2 extends Builder {
    
        @Override
        public void buildCPU() {
            System.out.println("i7");
        }
    }
    

    步骤 4(指挥者(Director))

    /*
    Director类——指挥者类
     */
    public class Director {
    
        public  Product Concrete(Builder builder)
        {
            Product product;
            product=builder.CreateProduct();
            builder.buildCPU();
            return product;
        }
    }
    

    步骤 5

    /*
    建造者模式(Builder Pattern)
    客户端测试
     */
    public class  BuilderPetternDescription {
    
         public static void main(String[] arg)
         {
    
             Director director=new Director();
    
             Builder builder=new ConcreteBuilder();
             Product products=director.Concrete(builder);
    
             Builder  builder2=new ConcreteBuilder2();
             Product product=director.Concrete(builder2);
         }
    }
    
     
    结果:

    i5
    i7

    我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

    我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

    建造者模式与工厂模式的不同:

    建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,顺序不同产生的对象也不同;

    工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。

  • 相关阅读:
    C# 综合练习题目 及 答案解析
    SQL数据库子查询练习题及解析
    SQL数据库 连接查询、变量、选择、循环、延时语句等
    SQL数据库中模糊查询、排序、聚合函数、数学函数、字符串函数、时间日期函数、转换、函数转换等
    SQL数据库的创建及简单增删改查语句运用
    SQL数据库简介
    ado.net操作数据库
    轻松美化窗体
    面向对象(委托)
    面向对象(五大原则)
  • 原文地址:https://www.cnblogs.com/shumeigang/p/13091638.html
Copyright © 2011-2022 走看看