zoukankan      html  css  js  c++  java
  • 设计模式建造者模式(图解,使用场景)

    设计模式-建造者模式

    建造者模式,本文讲了注意事项,使用环境,定义等多种情况.

    1. 定义

      将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示;

      其中有四种角色

        Product 产品

          通常是实现了模板方法模式,也就是有模板方法和基本方法,

        Builder 抽象建造者

          规范产品的重组,一般由子类完成

        ConcreteBuilder具体建造者

          实现抽象类定义的所有方法,并且返回一个好的对象.

        Director 导演类

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

      1.2 建造类的基本代码

        1.2.1 product 产品

          

    1 public class Product(){
    2     
    3    public void doSomething(){
    4        //具体什么事情
    5     }
    6 }

        1.2.2 抽象建造类

     

    1 public abstract class Builder {
    2     //设置不同产品的不同部分
    3      public abstract void setPart();
    4     //建造产品
    5     public abstract Product buildProduct();
    6     }

      1.2.3 具体建造者

      

     1 public class ConcreateProduct extends Buidlder{
     2    private Product pro = new Product();
     3       
     4    //设置产品步骤,细节
     5      public void setPart(){
     6      //产品类的逻辑处理
     7   }  
     8    
     9    //组建一个产品
    10    public Product builidProduct(){
    11        return product;    
    12   }  
    13 }

      1.2.4 导演类

      起到封装的作用,避免高层模块深入到建造者内部的实现类中.当然如果建造类模式比较庞大时,导演类可以有多个.

    1 public class Director{
    2   private Builder builder = new ConcreateBuilder();
    3     
    4   //构建不同的产品
    5   public Product getProductA(){
    6      builder.setPart();
    7     return builder.builidProduct();    
    8   }
    9 }

    2 . 具体例子

    这里其实我们也使用了 "模板方法"模式的,有兴趣的朋友可以看下我上个 ::设计模式-模板方法模式的实现的

    2.1 产品类

      

    public abstract class CarModel {
        //各方法执行的顺序
        private ArrayList<String>seqList = new ArrayList<>();
        //启动
        protected abstract void start();
        //鸣笛
        protected abstract void didi() ;
        //跑起来
        protected abstract void run();
        //停止
        protected abstract void stop();
        
        //模板方法
        final public void exc(){
            //循环判断执行顺序
            for (String seq : seqList) {
                if (seq.equalsIgnoreCase("start")) {
                    start();
                }else if (seq.equalsIgnoreCase("didi")) {
                    didi();
                }else if (seq.equalsIgnoreCase("run")) {
                    run();
                }else if (seq.equalsIgnoreCase("stop")) {
                    stop();
                }
            }
        }
        
        //设置seqList值
        public final void setSeqList(ArrayList<String> seqList){
            this.seqList = seqList;
        }
    }
    //具体产品实现类
    public class BenzModel extends CarModel {
    
        // 启动
        protected void start() {
            System.out.println("奔驰启动");
        }
    
        // 鸣笛
        protected void didi() {
            System.out.println("奔驰鸣笛");
        }
    
        // 跑起来
        protected void run() {
            System.out.println("奔驰跑起来");
        }
    
        // 停止
        protected void stop() {
            System.out.println("奔驰停下来");
        }
    }

    //测试类

    public class Test {
        public static void main(String[] args) {
            BenzModel benz = new BenzModel();
            ArrayList<String>list = new ArrayList<>();
            list.add("start");
            list.add("didi");
            list.add("stop");
            benz.setSeqList(list);
            benz.exc();
        }
    }

    以上主要是模板设计模式的使用.现在根据需求改装

    // 1. 抽象汽车组装者

    public abstract class CarBuilder {
        //建造一个模型
        public abstract void setSeqList(ArrayList<String> seqList);
        //模型完成后,就可以直接拿到这个模型
        public abstract CarModel getCarModel();
    }

    /2 .具体的组装者

    public class BenzBuilder extends CarBuilder{
    
        private BenzModel benzModel = new BenzModel();
        public void setSeqList(ArrayList<String> seqList) {
            this.benzModel.setSeqList(seqList);
        }
    
        public CarModel getCarModel() {
            return this.benzModel;
        }
    
    }

    3.要一个奔驰车

    public class Cilent {
        public static void main(String[] args) {
            /**
             * 设置一个顺序List
             */
            ArrayList<String>seqList = new ArrayList<>();
            seqList.add("start");
            seqList.add("didi");
            seqList.add("stop");
            //要一个奔驰车
            BenzBuilder benzBuilder = new BenzBuilder();
            benzBuilder.setSeqList(seqList);
            BenzModel benzModel = (BenzModel) benzBuilder.getCarModel();
            benzModel.exc();
        }
    }

    4.导演类

    public class Director {
        ArrayList<String> seqList = new ArrayList<>();
        // 这里可以有多个,具体的创建类
        BenzBuilder benzBuilder = new BenzBuilder();
    
        // A种奔驰
        public BenzModel getABenz() {
            seqList.clear();
            seqList.add("start");
            seqList.add("end");
            benzBuilder.setSeqList(seqList);
            return (BenzModel) benzBuilder.getCarModel();
        }
    
        // B种奔驰
        public BenzModel getBBenz() {
            seqList.clear();
            seqList.add("start");
            seqList.add("didi");
            seqList.add("end");
            benzBuilder.setSeqList(seqList);
            return (BenzModel) benzBuilder.getCarModel();
        }
    }

    这样确定了完成细节,就能呢个直接获得某种产品了.

     

    3.建造者的应用 

     3.1 建造者的优点

      1.封装性,全部都封装得特别好

      2.独立性,扩展性,需要扩展了就直接添加一个品种就行

      3.便于控制细节风险控制

    3.2 使用场景

      1.相同的的方法,不同的执行顺序,产生不同的结果

      2.多个部件和零件,都可以装配到一个对象中去,但是产生的结果又不相同

      3.产品类特别复杂,或者产品类中的调用顺序 不同产生了不同的效能,

      4.在建造者模式中使用到系统的一些其他对象,这些对象在创建过程中不易得到时,也可以采用才模式封装创建过程.这样只是一个补偿方法.

    3.3 和工厂模式的不同

      看着很像,但是确非常不同,这个我们在后面的工厂模式中再细细讲解吧

    3.4  使用的时候一定要注意 "模板设计"模式,两个搭配起来用,这个是非常重要的

  • 相关阅读:
    ZOJ4125 Sekiro
    ZOJ4118 Stones in the Bucket
    ZOJ4115 Wandering Robot
    ZOJ4113 Calandar
    【递归】N皇后问题 和 2n皇后问题 dfs
    7-18
    7_13
    二维前缀和
    64位整数乘法
    【分治】魔法石的诱惑
  • 原文地址:https://www.cnblogs.com/aihuxi/p/8135503.html
Copyright © 2011-2022 走看看