建造者模式

作者: fancy_boy_石嘉成 | 来源:发表于2018-07-29 17:38 被阅读4次

    《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
    目录:设计模式
    Github地址:DesignPattern

    说明

    定义:建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    UML图:

    建造者模式UML图.png

    代码实现:

    Product类,产品类,由多个部件组成

    class Product{
        List<String> parts = new ArrayList<>();
    
        public void Add(String part){
            parts.add(part);
        }
    
        public void show(){
            System.out.println("产品 创建-----");
            for (String part:parts){
                System.out.println(part);
            }
        }
    }
    

    Builder类-抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult

    abstract class Builder{
        public abstract void BuildPartA();
        public abstract void BuildPartB();
        public abstract Product GetResult();
    }
    

    ConcreteBuilder1类-具体建造者类

    class ConcreteBuilder1 extends Builder{
    
        private Product product = new Product();
    
        @Override
        public void BuildPartA() {
            product.Add("部件A");
        }
    
        @Override
        public void BuildPartB() {
            product.Add("部件B");
        }
    
        @Override
        public Product GetResult() {
            return product;
        }
    }
    

    ConcreteBuilder2类-具体建造者类

    class ConcreteBuilder2 extends Builder{
    
        private Product product = new Product();
    
        @Override
        public void BuildPartA() {
            product.Add("部件X");
        }
    
        @Override
        public void BuildPartB() {
            product.Add("部件Y");
        }
    
        @Override
        public Product GetResult() {
            return product;
        }
    }
    

    Director类-指挥者类

    class Director{
        public void Construct(Builder builder){
            builder.BuildPartA();
            builder.BuildPartB();
        }
    }
    

    客户端代码

    public class BuilderPattern {
        public static void main(String[] args){
            Director director = new Director();
            Builder b1 = new ConcreteBuilder1();
            Builder b2 = new ConcreteBuilder2();
    
            director.Construct(b1);
            Product p1 = b1.GetResult();
            p1.show();
    
    
            director.Construct(b2);
            Product p2 = b2.GetResult();
            p2.show();
        }
    }
    

    运行结果

    产品 创建-----
    部件A
    部件B
    产品 创建-----
    部件X
    部件Y
    

    示例

    例子:用程序模拟一个画小人的过程,要画两个小人,一个胖的一个瘦的。要求小人要有头、身体、两个胳膊、两个腿。

    UML图:

    建造者模式示例UML图.png

    代码实现:

    抽象建造人的类

    public abstract class PersonBuilder {
        public abstract void BuildHead();
        public abstract void BuildBody();
        public abstract void BuildArmLeft();
        public abstract void BuildArmRight();
        public abstract void BuildLegLeft();
        public abstract void BuildLegRight();
    }
    
    

    建造瘦的小人

    public class PersonThinBuilder extends PersonBuilder{
        @Override
        public void BuildHead() {
            System.out.println("画一个瘦瘦的头");
        }
    
        @Override
        public void BuildBody() {
            System.out.println("画一个瘦瘦的身体");
        }
    
        @Override
        public void BuildArmLeft() {
            System.out.println("画一个瘦瘦的左胳膊");
        }
    
        @Override
        public void BuildArmRight() {
            System.out.println("画一个瘦瘦的右胳膊");
        }
    
        @Override
        public void BuildLegLeft() {
            System.out.println("画一个瘦瘦的左腿");
        }
    
        @Override
        public void BuildLegRight() {
            System.out.println("画一个瘦瘦的右腿");
        }
    }
    
    
    

    建造胖的小人

    public class PersonFatBuilder extends PersonBuilder{
        @Override
        public void BuildHead() {
            System.out.println("画一个胖胖的头");
        }
    
        @Override
        public void BuildBody() {
            System.out.println("画一个胖胖的身体");
        }
    
        @Override
        public void BuildArmLeft() {
            System.out.println("画一个胖胖的左胳膊");
        }
    
        @Override
        public void BuildArmRight() {
            System.out.println("画一个胖胖的右胳膊");
        }
    
        @Override
        public void BuildLegLeft() {
            System.out.println("画一个胖胖的左腿");
        }
    
        @Override
        public void BuildLegRight() {
            System.out.println("画一个胖胖的右腿");
        }
    }
    
    
    

    指挥者,用来控制建造过程

    public class PersonDirector {
        private PersonBuilder pb;
        public PersonDirector(PersonBuilder pb){
            this.pb = pb;
        }
    
        public void CreatePerson(){
            pb.BuildHead();
            pb.BuildBody();
            pb.BuildArmLeft();
            pb.BuildArmRight();
            pb.BuildLegLeft();
            pb.BuildLegRight();
        }
    }
    

    客户端代码

    public class Main {
        public static void main(String[] args){
            PersonBuilder ptb = new PersonThinBuilder();
            PersonDirector pdThin = new PersonDirector(ptb);
            pdThin.CreatePerson();
    
            PersonBuilder pfb = new PersonFatBuilder();
            PersonDirector pdFat = new PersonDirector(pfb);
            pdFat.CreatePerson();
        }
    }
    

    运行结果

    画一个瘦瘦的头
    画一个瘦瘦的身体
    画一个瘦瘦的左胳膊
    画一个瘦瘦的右胳膊
    画一个瘦瘦的左腿
    画一个瘦瘦的右腿
    画一个胖胖的头
    画一个胖胖的身体
    画一个胖胖的左胳膊
    画一个胖胖的右胳膊
    画一个胖胖的左腿
    画一个胖胖的右腿
    

    相关文章

      网友评论

        本文标题:建造者模式

        本文链接:https://www.haomeiwen.com/subject/mhctvftx.html