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

    建造者角色:

    分为抽象建造者、具体建造者

    package designpattern.creation.builder;
    
    public interface Builder {
    
        void buildPart1();
        void buildPart2();
        void buildPart3();
        void buildPartn();
        
        IProduct retrieveResult();
    }
    
    package designpattern.creation.builder;
    
    public class ConcreteBuilder1 implements Builder {
    
        IProduct product;
        
        public ConcreteBuilder1() {
            product = new Product();
        }
        
        // 
        public void buildPart1() {
             // --- 此处的参数由具体的建造者决定,表示具体的建造过程,
            //这些对外界是不可知的! —— 这既是建造者模式的真正含义!!!
            product.setPart1("part1");
            System.out.println("ConcreteBuilder.buildPart1()");
        }
    
        public void buildPart2() {
            product.setPart2("part2");
            System.out.println("ConcreteBuilder.buildPart2()");
        }
    
        public void buildPart3() {
            product.setPart3("part3");
            System.out.println("ConcreteBuilder.buildPart3()");
        }
    
        public void buildPartn() {
            product.setPartn("partn");
            System.out.println("ConcreteBuilder.buildPartn()");
        }
    
        public IProduct retrieveResult() {
            buildPart1();//可以吧参数放到这个位置传入?
            buildPart2();
            buildPart3();
            buildPartn();
            return product;
        }
    
    }
    
    package designpattern.creation.builder;
    
    public class ConcreteBuilder2 implements Builder {
    
        IProduct product;
        
        public ConcreteBuilder2() {
            product = new Product();
        }
        
        // 
        public void buildPart1() {
             // --- 此处的参数由具体的建造者决定,表示具体的建造过程,
            //这些对外界是不可知的! —— 这既是建造者模式的真正含义!!!
            product.setPart1("part1xx");
            System.out.println("ConcreteBuilder2.buildPart1()");
        }
    
        public void buildPart2() {
            product.setPart2("part2xx");
            System.out.println("ConcreteBuilder2.buildPart2()");
        }
    
        public void buildPart3() {
            product.setPart3("part3xx");
            System.out.println("ConcreteBuilder2.buildPart3()");
        }
    
        public void buildPartn() {
            product.setPartn("partnxx");
            System.out.println("ConcreteBuilder2.buildPartn()");
        }
    
        // 应该把buildPart1..n的建造过程放在这里吗??还是应该放在Director里面呢?
        public IProduct retrieveResult() {
            buildPart1();//可以吧参数放到这个位置传入?
            buildPart2();
            buildPart3();
            buildPartn();
            return product;
        }
    
    }

    指导者角色:

    package designpattern.creation.builder;
    
    
    /**
     * 
     * Director 即相当于工厂的角色, 负责构建,或者说生产,具体产品
     * @author Administrator
     *
     */
    public class Director {
    
        Builder builder;
        public Director(Builder builder) {
            this.builder = builder;
        }
        
        // Director 负责指导建造产品!
        public IProduct build() {
    //        builder.buildPart1();//可以吧参数放到这个位置传入?
    //        builder.buildPart2();
    //        builder.buildPart3();
    //        builder.buildPartn();
            
            return builder.retrieveResult();
        }
    }

    产品角色:

    package designpattern.creation.builder;
    
    public interface IProduct {
    
        void setPart1(String part);
        void setPart2(String part);
        void setPart3(String part);
        void setPartn(String part);
    
        
        void use();
    }
    
    package designpattern.creation.builder;
    
    public class Product implements IProduct {
    
        String part1;
        String part2;
        String part3;
        String partn;
        
        public String getPart1() {
            return part1;
        }
        public void setPart1(String part1) {
            this.part1 = part1;
        }
        public String getPart2() {
            return part2;
        }
        public void setPart2(String part2) {
            this.part2 = part2;
        }
        public String getPart3() {
            return part3;
        }
        public void setPart3(String part3) {
            this.part3 = part3;
        }
        public String getPartn() {
            return partn;
        }
        public void setPartn(String partn) {
            this.partn = partn;
        }
        public void use() {
            // TODO Auto-generated method stub
            System.out.println("ProductA.use() :" + this.toString());
        }
        
    
        public void buildPart1() {
            this.part1 = "part1";
            System.out.println("ConcreteBuilder.buildPart1()");
        }
    
        public void buildPart2() {
            this.part1 = "part2";
            System.out.println("ConcreteBuilder.buildPart2()");
        }
    
        public void buildPart3() {
            this.part1 = "part3";
            System.out.println("ConcreteBuilder.buildPart3()");
        }
    
        public void buildPartn() {
            this.part1 = "partn";
            System.out.println("ConcreteBuilder.buildPartn()");
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return this.getPart1() + " " + this.getPart2() + " " + 
            this.getPart3() + " " + this.getPartn() + "";
        }
        
    }

    客户端:

    package designpattern.creation.builder;
    
    
    /**
     * 
    如果你需要创建一个对象,这个对象很复杂:
        有很多部件组成,部件和部件之间可能存在(也可能不存在)一定的顺序和链接关系,而你又不想让客户知道这些对象内部细节(比如一道中药秘方,有哪些配料,如何调配,能让别人知道吗?-__-),
    那么你可以选择Builder模式来创建这个对象。
     */
    public class Client {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            IProduct product = new Director(new ConcreteBuilder1()).build();
            product.use();
    
            IProduct product2 = new Director(new ConcreteBuilder2()).build();
            product2.use();
        }
    
    }

    ———— 感觉跟模板方法模式比较相像—— 如果把buildPart3看做带实现的模板方法

  • 相关阅读:
    I/O多路复用技术
    网络编程的异常及处理
    LINUX的signal
    网络编程小知识
    一个位压缩技巧
    加密技术[翻译]
    暴雪的hash算法[翻译]
    喜欢就好
    【PYTHON】编码是个细致活
    【Python3】POP3协议收邮件
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/3916827.html
Copyright © 2011-2022 走看看