• 初识设计模式(建造者模式)


    前言:继续学习设计模式,今天学习建造者模式。

    建造者模式(Builder Pattern)

    定义

      又叫生成器模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    设计原则

      依赖倒转原则,抽象不应该依赖细节,细节应该依赖抽象。

    目的

      如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。

    什么时候使用

      主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的(产品对象具有共性),但对象内部的构建通常面临着复杂的变化。

    好处

      使得建造者代码与表示代码分离,达到解耦。

      由于建造者隐藏了该产品是如何组装的,所以若要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了,符合“开闭原则”。

      将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,易于精确控制对象的创建。

    缺点

      建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

      如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

    结构图

    基本代码

    具体产品

    package designpatterns.builder;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 具体产品
     * @author yule
     * @date 2018/8/12 13:32
     */
    public class Product {
        private List<String> parts = new ArrayList<>();
    
        /**
         * 添加产品部件
         * @param part
         */
        public void addPart(String part){
            parts.add(part);
        }
    
        /**
         * 列举所有产品部件
         */
        public void show(){
            System.out.println("产品创建:");
            for(String part : parts){
                System.out.println(part);
            }
        }
    }

    创建抽象建造者,假设一个产品需要partA,partB组成

    package designpatterns.builder;
    
    /**
     * 抽象建造者
     * @author yule
     * @date 2018/8/12 13:36
     */
    public abstract class Builder {
        public abstract void builderPartA();
        public abstract void builderPartB();
    
        public abstract Product getProduct();
    }

    创建具体建造者1

    package designpatterns.builder;
    
    /**
     * 具体建造者1
     * @author yule
     * @date 2018/8/12 13:37
     */
    public class ConcreteBuilder1 extends Builder{
    
        private Product product = new Product();
    
        @Override
        public void builderPartA() {
            product.addPart("部件A1");
        }
    
        @Override
        public void builderPartB() {
            product.addPart("部件B1");
        }
    
        @Override
        public Product getProduct() {
            return product;
        }
    }

    创建具体建造者2

    package designpatterns.builder;
    
    /**
     * 具体建造者2
     * @author yule
     * @date 2018/8/12 13:39
     */
    public class ConcreteBuilder2 extends Builder{
    
        private Product product = new Product();
    
        @Override
        public void builderPartA() {
            product.addPart("部件A2");
        }
    
        @Override
        public void builderPartB() {
            product.addPart("部件B2");
        }
    
        @Override
        public Product getProduct() {
            return product;
        }
    }

    创建指挥者,用来指挥创建过程

    package designpatterns.builder;
    
    /**
     * 指挥者,用来指挥创建过程
     * @author yule
     * @date 2018/8/12 13:40
     */
    public class Director {
        public void Construct(Builder builder){
            builder.builderPartA();
            builder.builderPartB();
        }
    }

    客户端代码,客户不需要知道具体的建造过程

        public static void main(String[] args){
            Director director = new Director();
    
            Builder builder1 = new ConcreteBuilder1();
            director.Construct(builder1);
            Product product1 = builder1.getProduct();
            product1.show();
    
            Builder builder2 = new ConcreteBuilder2();
            director.Construct(builder2);
            Product product2 = builder2.getProduct();
            product2.show();
        }
  • 相关阅读:
    <java基础学习>01环境变量配置
    HTML 之 head
    PHP基础教程-54课-问题
    HTML 中级2
    HTML 中级
    html添加mp3背景音乐全兼容办法
    ElasticSearch笔记(一)—— CentOS 7 安装elasticsearch 7.14 head插件和Kibana,IK分词器安装
    The user specified as a definer ('root'@'%') does not exist 问题解决
    Springboot使用mybatis框架配置多数据源
    CentOS 7 下oracle 11G R2 ADG 搭建
  • 原文地址:https://www.cnblogs.com/yuxiaole/p/9462784.html
Copyright © 2020-2023  润新知