• 设计模式-建造者模式


    定义:属于创建型模式,提供了一种创建对象的方式,一个 Builder 类会一步一步使用简单对象构造出最终的复杂对象,这个Builder 类是独立于其他对象的

    角色:产品(Ailoy())、抽象建造者(Builder())、建造者(BuilderA()、BuilderB()、NumA()、NumB())、指挥者(Scientist())

    目标:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示

    优点:封装性好,扩展性好,各个具体的建造者相互独立,有利于系统的解耦

         建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险

    缺点:产品必须有共同点,范围有限制

       内部变化复杂,会有很多的建造类

    实现:

    //产品
    public class Alloy {
        private String name;
        private List<String> stuff;
        private int num;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setStuff(List<String> stuff) {
            this.stuff = stuff;
        }
    
    
        public void setNum(int num) {
            this.num = num;
        }
    
        public String show(){
            StringBuffer stringBuffer = new StringBuffer();
            for (String st: stuff) {
                stringBuffer.append(st);
                stringBuffer.append("||");
            }
            return this.name+"&&"+stringBuffer.toString()+"&&"+this.num;
        }
    }
    
    //抽象建造者
    public abstract class Builder {
        Alloy alloy = new Alloy();
        public  abstract void buildName();
        public  abstract void buildStuff();
        public  abstract void buildNum();
        public  Alloy resultAlloy( ){
            return alloy;
        }
    }
    
    //具体建造者A
    public class BuilderA extends Builder{
    
        @Override
        public void buildName() {
            alloy.setName("钠铁合金");
        }
    
        @Override
        public void buildStuff() {
            List<String> list = new ArrayList<String>();
            list.add("Fe");
            list.add("Na");
            alloy.setStuff(list);
        }
    
        @Override
        public void buildNum() {
            alloy.setNum(new NumA().num());
        }
    }
    //具体建造者B
    public class BuilderB extends Builder {
        @Override
        public void buildName() {
            alloy.setName("铝镁合金");
        }
    
        @Override
        public void buildStuff() {
            List<String> list = new ArrayList<String>();
            list.add("Mg");
            list.add("Al");
            alloy.setStuff(list);
        }
    
        @Override
        public void buildNum() {
            alloy.setNum(new NumB().num());
        }
    }
    //具体建造者C
    public class NumA {
        public int num(){
            return 5;
        }
    }
    //具体建造者D
    public class NumB {
        public int num(){
            return 10;
        }
    }
    
    //指挥者
    public class Scientist {
        private Builder builder;
        public Scientist (Builder builder){
            this.builder = builder;
        }
        public Alloy study(){
            builder.buildName();
            builder.buildStuff();
            builder.buildNum();
            return builder.resultAlloy();
        }
    }
    
    //测试方法
    public class Test {
        public static void main(String[] args) {
            Builder builder = new BuilderA();
            Scientist scientist = new Scientist(builder);
            Alloy alloy = scientist.study();
            System.out.println(alloy.show());
    
        }
    }
    //测试结果
    钠铁合金&&Fe||Na||&&5
    

      

  • 相关阅读:
    再战CS231-数组的访问
    win10定时关机
    再战CS231-快速排序
    数据库权限
    numpy
    anaconda
    控件的相对位置与绝对位置-UI界面编辑器(SkinStudio)教程
    共用字体-UI界面编辑器(SkinStudio)教程
    添加图片按钮-UI界面编辑器(SkinStudio)教程
    为窗体设置背景图片-UI界面编辑器(SkinStudio)教程
  • 原文地址:https://www.cnblogs.com/carblack/p/13738849.html
Copyright © 2020-2023  润新知