zoukankan      html  css  js  c++  java
  • 设计模式学习笔记之生成器模式

    生成器模式
        封装一个产品的构造过程,并允许按步骤构造。
        将一个复杂对象的构建与表示分离,使同样的构造过程可以创建不同的表示。
     

        生成器模式结构中的四种角色

        产品(Product): 所要构建的复杂对象。

        抽象生成器(Builder): 抽象生成器是一个接口,该接口除了为创建一个Product对象的各个组件定义若干个方法外,还要定义返回Product对象的方法。

        具体生成器(ConcreteBuilder): 实现Buidler接口的类。

        指挥者(Director): 指挥者是一个类,该类需含有Builder接口申明的变量,指挥者的职责是负责向用户提供具体的生成器,利用具体生成器构造复杂的Product对象。

        生成器的优点:

        1、将一个复杂对象的创建过程封装起来;

        2、允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同);

        3、向客户隐藏产品内部的表现;

        4、产品的实现可以被替换,因为客户只看到一个抽象的接口。

       生成器模式的缺点:

        1、与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识;

       生成器模式的用途:

        1、经常被用来创建组合结构;

    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    /**
     * 产品
     * */
    public class PanelProduct extends JPanel{
     
        JButton button;
        JLabel label;
        JTextField textfield;
     
    }
    /**
     * 抽象生成器
     * */
    public interface Builder {
     
        public void buildButton();
     
        public void buildLabel();
     
        public void buildTextField();
     
        public JPanel getPanel();
     
    }
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    /**
     * 具体生成器
     * */
    public class ConcreteBuilder implements Builder{
     
        private PanelProduct product;
     
        public ConcreteBuilder() {
            product = new PanelProduct();
        }
     
        public void buildButton() {
            product.button = new JButton("按钮");
        }
     
        public void buildLabel() {
            product.label = new JLabel("标签");
        }
     
        public void buildTextField() {
            product.textfield = new JTextField("文本框");
        }
     
        public JPanel getPanel() {
            product.add(product.button);
            product.add(product.label);
            product.add(product.textfield);
            return product;
        }
     
    }
    import javax.swing.JPanel;
     
    /**
     * 指挥者
     * */
    public class Director {
     
        private Builder builder;
     
        public Director(Builder builder) {
            this.builder = builder;
        }
     
        public JPanel constructProduct() {
            builder.buildButton();
            builder.buildLabel();
            builder.buildTextField();
            JPanel panel = builder.getPanel();
            return panel;
        }
     
    }
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Client {
     
        public static void main(String[] args) {
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);
            JPanel panel = director.constructProduct();
            JFrame frame = new JFrame();
            frame.add(panel);
            frame.setBounds(12, 12, 200, 120);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.setVisible(true);
        }
     
    }
     

    参考资料:《Head First 设计模式》

  • 相关阅读:
    Thymeleaf踩坑:[[ 和 ]] 被当做表达式解析,但是想要的就是数组,怎么办?
    RoamEdit 邀请码
    python:新版xlrd报 Excel xlsx file; not supported
    JavaFX学习:快捷键
    JavaFX学习:键盘事件
    JavaFX学习:连续点击事件
    JavaFX学习:Button基本使用
    (转)IDEA 更新插件时报错 SSL error probably caused by disabled SNI
    TextControl技术互助
    一个简单的Webservice的demo(中)_前端页面调用
  • 原文地址:https://www.cnblogs.com/LeslieXia/p/5495308.html
Copyright © 2011-2022 走看看