美文网首页
创建型设计模式-构建者模式

创建型设计模式-构建者模式

作者: 微风细雨007 | 来源:发表于2017-11-14 16:22 被阅读97次

    更新

    Builder模式的使用场景

    • 相同的方法,不同的执行顺序,产生不同的事件结果(示例的场景);
    • 多个部件或零件,都可以装配到一个对象中,但产生的运行结果又不相同;
    • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常适合;
    • 当初始化一个对象非常复杂,如参数多,很多参数都具有默认值。

    小结

    Builder模式比较常见的实现形式是通过调用链实现,这样使代码更简洁、易懂。

    优点

    • 良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
    • 建造者独立,容易扩展。

    缺点

    • 会产生多余的Builder对象以及Director对象,消耗内存。

    理论

    定义

    百度百科
    java23种设计模式之一,英文叫Builder Pattern。其核心思想是将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。

    组成

    • 产品(Product):是被构建的对象,是包含多个组件的复杂结构。
    • 抽象建造者(Builder):为创建的产品对象规定抽象接口,一般包括两类方法,一类是创建组件的方法(以build开头),一类是返回创建的对象的方法。
    • 具体建造者(ConcreteBuilder):实现建造者接口,实现各个部件的具体构造和装配方法。
    • 导演者(Director):负责指挥复杂对象的构建次序。

    示例

    以我们东北好吃的饺子为例,包括饺子皮,饺子馅,饺子做法,和蘸料;可以做肉馅和素馅的饺子

    序号 类名 角色 说明
    1 JiaoZi 产品 Product 饺子
    2 JiaoZiBuilder 抽象建造者 Builder 饺子做法流程
    3 BuilderDirector 导演者 Director 厨师
    4 MeatJiaoZiBuilder 具体建造者 ConcreteBuilder 肉馅饺子做法
    5 VegetableJiaoZiBuilder 具体建造者 ConcreteBuilder 素馅饺子做法
    6 CustomMain 客户端 食客(吃货)

    1.饺子类

    public class JiaoZi {
        //皮
        private String skin;
        //馅
        private String stuffing;
        //做法
        private String practice;
        //蘸料
        private String dip;
    
        public String getSkin() {
            return skin;
        }
    
        public void setSkin(String skin) {
            this.skin = skin;
        }
    
        public String getStuffing() {
            return stuffing;
        }
    
        public void setStuffing(String stuffing) {
            this.stuffing = stuffing;
        }
    
        public String getPractice() {
            return practice;
        }
    
        public void setPractice(String practice) {
            this.practice = practice;
        }
    
        public String getDip() {
            return dip;
        }
    
        public void setDip(String dip) {
            this.dip = dip;
        }
    
        @Override
        public String toString() {
            return "饺子{" +
                    "皮='" + skin + '\'' +
                    ", 馅='" + stuffing + '\'' +
                    ", 做法='" + practice + '\'' +
                    ", 蘸料='" + dip + '\'' +
                    '}';
        }
    }
    

    2.抽象建造者 Builder (饺子做法流程)

    public interface JiaoZiBuilder {
        void buildSkin();
    
        void buildStuffing();
    
        void buildPractice();
    
        void buildDip();
    
        JiaoZi buildJiaoZi();
    }
    

    3.导演者 Director(厨师)

    public class BuilderDirector {
        public BuilderDirector() {
        }
    
        public JiaoZi constructor(JiaoZiBuilder jiaoZiBuilder){
            jiaoZiBuilder.buildSkin();
            jiaoZiBuilder.buildStuffing();
            jiaoZiBuilder.buildPractice();
            jiaoZiBuilder.buildDip();
            return jiaoZiBuilder.buildJiaoZi();
        }
    }
    

    4.具体建造者 ConcreteBuilder(肉馅饺子做法)

    public class MeatJiaoZiBuilder implements JiaoZiBuilder {
        private JiaoZi jz = new JiaoZi();
        @Override
        public void buildSkin() {
            jz.setSkin("白面");
        }
    
        @Override
        public void buildStuffing() {
            jz.setStuffing("猪肉芹菜");
        }
    
        @Override
        public void buildPractice() {
            jz.setPractice("水煮");
        }
    
        @Override
        public void buildDip() {
            jz.setDip("酱油");
        }
    
        @Override
        public JiaoZi buildJiaoZi() {
            return jz;
        }
    }
    

    5.具体建造者 ConcreteBuilder(素馅饺子做法)

    public class VegetableJiaoZiBuilder implements JiaoZiBuilder {
        private JiaoZi jz = new JiaoZi();
    
        @Override
        public void buildSkin() {
            jz.setSkin("白面");
        }
    
        @Override
        public void buildStuffing() {
            jz.setStuffing("酸菜粉条");
        }
    
        @Override
        public void buildPractice() {
            jz.setPractice("清蒸");
        }
    
        @Override
        public void buildDip() {
            jz.setDip("陈醋");
        }
    
        @Override
        public JiaoZi buildJiaoZi() {
            return jz;
        }
    }
    

    6.客户端(吃货)

    public class CustomMain {
        public static void main(String[] args) {
            //猪肉饺子
            BuilderDirector director = new BuilderDirector();
            JiaoZi meatJiaoZi = director.constructor(new MeatJiaoZiBuilder());
            System.out.println(meatJiaoZi);
            //酸菜饺子
            JiaoZi vegetableJiaoZi = director.constructor(new VegetableJiaoZiBuilder());
            System.out.println(vegetableJiaoZi);
        }
    }
    

    相关文章

      网友评论

          本文标题:创建型设计模式-构建者模式

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