zoukankan      html  css  js  c++  java
  • 建造者(构造器)模式--设计模式

    今天将讲述设计模式的另一篇--建造者(构造器)模式,网上的资料也有很多,但感觉都是大而同,小而不同,希望本篇可以为大家增加点对建造者模式的认识和理解.

    介绍

    1.1 建造者(构建器)模式

    建造者(构建器)--Builder模式, 是将一个复杂对象的构建与表示相分离,是的同样的构建过程可以有不同的创建表示.

    将一个复杂的对象分解了多个简单的对象, 然后一步步的构建成.达到了将变与不变相分离, 即组成部分是不变的, 但是是每一部分又可以达到灵活选择.

    Builder模式隐藏了复杂对象的创建过程, 将复杂对象在创建过程加以抽象, 通过子类基础或重载的方式,动态创建具有符合属性的对象.

    1.2 Builder优缺点

    优点

    • 各个具体的构建器都是相互独立的, 利于系统的扩展
    • 客户端不必知道具体产品内部的实现

    缺点

    • 产品组成部分必须要相同, 限制了使用范围
    • 假如产品内部变化复杂, 会增加更多的建造者类

    Builder模式和工厂模式的关注点是不同的, Builder模式更注重产品零件的组装过程, 而工厂模式更加注重产品零件的创建过程, 两者是可以结合起来使用的

    1.3 适用场景

    • 隔离复杂对象的创建和使用,同样的方法不同的执行顺序,从而产生不同事件的结果
    • 初始化对象时,参数很多或者很多参数都具有默认值
    • 不适合创建差异化很大的产品类,如果产品内部变化负责时,会导致定义很多建造者来实现变化,增加类的数量,增加了运行成本

    结构和实现

    Builder模式有产品、具体构造者、抽象构造者以及指挥者四个元素组成。

    2.1 角色

    Builder模式主要的角色如下

    • 产品角色(Product):是包含多个组成部件的复杂对象,而有具体的建造者来创建其各自的部件
    • 抽象建造者(Builder):一个包含创建产品各个子部件抽象方法的一个接口,通常还包含返回产品的方法getProduct()
    • 具体构造者(Concrete Builder):用来实现Builder接口,完成复杂产品各个子部件的具体创建方法
    • 指挥者(Director):完成复杂对象的创建以及装配,指挥中不会涉及具体产品的信息。

    2.2 结构

    而UML类图

    结构代码

    2.2.1 产品角色:包含多个组成部件的复杂对象

    class Product
    {
        private String partA;
        private String partB;
        private String partC;
        public void setPartA(String partA)
        {
            this.partA=partA;
        }
        public void setPartB(String partB)
        {
            this.partB=partB;
        }
        public void setPartC(String partC)
        {
            this.partC=partC;
        }
        public void show()
        {
            //显示产品的特性
        }
    }

    2.2.2 抽象建造者:包含创建各个子部件的抽象方法

    abstract class Builder
    {
        //创建产品对象
        protected Product product=new Product();
        public abstract void buildPartA();
        public abstract void buildPartB();
        public abstract void buildPartC();
        //返回产品对象
        public Product getResult()
        {
            return product;
        }
    }

    2.2.3 具体建造者:实现抽象建造者

    public class ConcreteBuilder extends Builder
    {
        public void buildPartA()
        {
            product.setPartA("建造 PartA");
        }
        public void buildPartB()
        {
            product.setPartA("建造 PartB");
        }
        public void buildPartC()
        {
            product.setPartA("建造 PartC");
        }
    }

    2.2.4 指挥者:调用建造者方法完成对复杂对象的创建过程。

    class Director
    {
        private Builder builder;
        public Director(Builder builder)
        {
            this.builder=builder;
        }
        //产品构建与组装方法
        public Product construct()
        {
            builder.buildPartA();
            builder.buildPartB();
            builder.buildPartC();
            return builder.getResult();
        }
    }

     2.2.5 客户端

    public class Client
    {
        public static void main(String[] args)
        {
            Builder builder=new ConcreteBuilder();
            Director director=new Director(builder);
            Product product=director.construct();
            product.show();
        }
    }

    实例:用Builder模式创建共享单车的例子

    3.1 产品类:包含多个组成部件的复杂对象

    车包括架构,座位以及轮胎。

    public class Bike { 
    
        private IFrame frame; 
        private ISeat seat; 
        private ITire tire; 
        
        public IFrame getFrame() { 
            return frame; 
        } 
        public void setFrame(IFrame frame) { 
            this.frame = frame; 
        } 
        public ISeat getSeat() { 
            return seat; 
        } 
        public void setSeat(ISeat seat) { 
            this.seat = seat; 
        } 
        public ITire getTire() { 
            return tire; 
        } 
        public void setTire(ITire tire) { 
            this.tire = tire; 
        } 
    } 

    3.2 Builder:包含创建产品各个子部件抽象方法的一个接口

    包含返回产品的方法getProduct()

    // 抽象 builder 类 
    public abstract class Builder { 
        abstract void buildFrame(); 
        abstract void buildSeat(); 
        abstract void buildTire(); 
        abstract Bike createBike(); 
    }

    3.3 ConcreteBuilder类:用来实现Builder接口

    完成复杂产品各个子部件的具体创建方法

    // 具体 builder 类 
    public class MobikeBuilder extends Builder{ 
        private Bike mBike = new Bike(); 
        @Override 
        void buildFrame() { 
            mBike.setFrame(new AlloyFrame()); 
        } 
        @Override 
        void buildSeat() { 
            mBike.setSeat(new DermisSeat()); 
        } 
        @Override 
        void buildTire() { 
            mBike.setTire(new SolidTire()); 
        } 
        @Override 
        Bike createBike() { 
            return mBike; 
        } 
    } 
    
    public class OfoBuilder extends Builder{ 
        private Bike mBike = new Bike(); 
        @Override 
        void buildFrame() { 
            mBike.setFrame(new CarbonFrame()); 
        } 
        @Override 
        void buildSeat() { 
            mBike.setSeat(new RubberSeat()); 
        } 
        @Override 
        void buildTire() { 
            mBike.setTire(new InflateTire()); 
        } 
        @Override 
        Bike createBike() { 
            return mBike; 
        } 
    } 

    3.4 指挥类:完成复杂对象的创建以及装配

    指挥中不会涉及具体产品的信息。

    public class Director { 
        private Builder mBuilder = null; 
        public Director(Builder builder) { 
            mBuilder = builder; 
        } 
        public Bike construct() { 
            mBuilder.buildFrame(); 
            mBuilder.buildSeat(); 
            mBuilder.buildTire(); 
            return mBuilder.createBike(); 
        } 
    }

    3.5 客户端调用

    public class Click { 
        public static void main(String[] args) { 
            showBike(new OfoBuilder()); 
            showBike(new MobikeBuilder()); 
        } 
        private void showBike(Builder builder) {
            Director director = new Director(builder); 
            Bike bike = director.construct(); 
            bike.getFrame().frame(); 
            bike.getSeat().seat(); 
            bike.getTire().tire(); 
        } 
    } 

    总结扩展

    Builder模式在应用过程中可以根据需求需要改变,如果创建的产品类只有一种,只需要一个具体建造者,可以省略抽象建造者,甚至可以去除指挥者的角色。

    通过上述讲解,希望大家对设计模式--构造器(建造者)--Builder模式有所理解!!!

  • 相关阅读:
    x01.JavaHello
    x01.Weiqi.1 提子算法
    x01.Weiqi.3 网络对弈
    Cryptography
    Javascript判断中文字节
    asp.net mvc,asp.net4.0空间出售
    Sql Server中判断日志是否为一个星期
    DIV+CSS实现二级导航菜单
    ExecutorService线程池 [转]
    Android程序开发所用app图标的几种大小
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11930316.html
Copyright © 2011-2022 走看看