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

    定义:属于创建型模式,提供了一种创建对象的方式,一个 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
    

      

  • 相关阅读:
    (转)SVN命令详解
    CentOS 64位系统安装32位兼容库
    Eclipse4.4 Tomcat插件下载地址
    记:Android 安装apk的代码实现
    记: Android adb远程调试
    记:Ubuntu14.04 Android加载项目失败
    记:Ubuntu 14.04 安装32位库支持库失败
    记:Android 服务站 问题记录与解决方案
    记:Android 知识点整理 20140329
    微信小程序和微信公众号的id是一个吗
  • 原文地址:https://www.cnblogs.com/carblack/p/13738849.html
Copyright © 2011-2022 走看看