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看做带实现的模板方法

  • 相关阅读:
    bzoj1415 NOI2005聪聪和可可
    Tyvj1952 Easy
    poj2096 Collecting Bugs
    COGS 1489玩纸牌
    COGS1487 麻球繁衍
    cf 261B.Maxim and Restaurant
    cf 223B.Two Strings
    cf 609E.Minimum spanning tree for each edge
    cf 187B.AlgoRace
    cf 760B.Frodo and pillows
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/3916827.html
Copyright © 2011-2022 走看看