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

    1、概念

    建造者模式可以叫生成器模式,属于创建型模式,它是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
    建造者模式
    2、模式结构

    • Builder:为创建一个Product对象的各个部件指定抽象接口
    • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口
    • Director:构造一个使用Builder接口的对象
    • Product:表示被构造的复杂对象
    • ConcreateBuilder:创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口

    3、使用场景

    • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性
    • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
    • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
    • 当构造过程必须允许被构造的对象有不同的表示时

    4、优缺点

    优点:

    • 建造者模式的封装性很好,将一个复杂对象的创建过程封装起来
    • 容易进行扩展,允许对象通过多个步骤来创建,并且可以改变过程
    • 向客户隐藏产品内部的实现
    • 产品的实现可以被替换,因为客户只看到了一个抽象的接口

    缺点:

    • 使用范围受到一定的限制,产品需要有共同性
    • 可能导致系统变得很庞大,如果产品内部变化复杂,会导致需要定义很多具体建造者类来实现这种变化

    5、实例

    public class Package {
        private String name;
        private float price;
        private List<Product> list;
    
        public String getName() {
            return name;
        }
    
        public float getPrice() {
            return price;
        }
    
        public List<Product> getList() {
            return list;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setPrice(float price) {
            this.price = price;
        }
    
        public void setList(List<Product> list) {
            this.list = list;
        }
    }
    
    public abstract class Builder {
        public abstract void setPackage(String name, float price, List<Product> list);
    
        public abstract Package getPackage();
    }
    
    public class ConcreteBuilder extends Builder {
    
        private Package aPackage = new Package();
    
        @Override
        public void setPackage(String name, float price, List<Product> list) {
            aPackage.setName(name);
            aPackage.setPrice(price);
            aPackage.setList(list);
        }
    
        @Override
        public Package getPackage() {
            return aPackage;
        }
    }
    
    public class Director {
        private Builder builder = new ConcreteBuilder();
    
        public Package getAPackage() {
            List<Product> list = new ArrayList<>();
            list.add(new Product("可乐", 10));
            list.add(new Product("薯条", 8.9f));
            builder.setPackage("A套餐", 18.9f, list);
            return builder.getPackage();
        }
    
        public Package getBPackage() {
            List<Product> list = new ArrayList<>();
            list.add(new Product("可乐", 10));
            list.add(new Product("汉堡", 20.9f));
            builder.setPackage("B套餐", 30.9f, list);
            return builder.getPackage();
        }
    }
    
  • 相关阅读:
    利用 Chrome 浏览器来模拟手势
    【风马一族_Java】java的一种IDE
    【风马一族_Android】强制activity的横屏与纵屏
    【风马一族_Android】多选按钮的监控事件
    【风马一族_Android】 图能
    100%的利用时间
    【风马一族_代码英语】代码英语之六
    【风马一族_Python】 决策树
    【风马一族_Python】 实施kNN算法
    编写高质量代码:改善Java的151个建议二:11-14(序列化相关内容)
  • 原文地址:https://www.cnblogs.com/fomin/p/9835391.html
Copyright © 2011-2022 走看看