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

       关于建造者模式,网上已经有很多比较完善的例子,这里为了完善自己对于设计模式的内容,再简单讲解一下吧,方便自己回顾,也为了设计模式专题不遗漏任何一个设计模式

    基本介绍:

        建造者模式也叫做生成器模式,是一种用于构建对象的模式。它可以将复杂对象的构建过程抽象出来成为一个抽象类或者接口,是这个抽象的过程的不同实现方法可以构造出不同表现(具有不同属性)的子类或者实现类对象。

       建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部具体构建细节是怎么实现的.

    包含角色:

      Product(产品角色) 一个具体的产品对象

      Builder(抽象建造者)  一个可以创建Product对象的各个零件的接口或者抽象类

      ConcreteBuilder(具体建造者) Builder的实现类或者子类,用于具体细节地去创建Product对象的各个零件

      Director (指挥者)内部会构建一个Builder实现类或者子类的对象,用于创建一个复杂的对象,其一是将用户与产品的生产过程进行隔离,其二是可以控制产品的生产过程

    产品角色

    public class CarProduct {
    
        private CarShell carShell;
    
        private Tire tire;
    
        private Engine engine;
    
        public CarShell getCarShell() {
            return carShell;
        }
    
        public CarProduct setCarShell(CarShell carShell) {
            this.carShell = carShell;
            return this;
        }
    
        public Tire getTire() {
            return tire;
        }
    
        public CarProduct setTire(Tire tire) {
            this.tire = tire;
            return this;
        }
    
        public Engine getEngine() {
            return engine;
        }
    
        public CarProduct setEngine(Engine engine) {
            this.engine = engine;
            return this;
        }
    }

    抽象建造者

    public abstract class CarBuilder {
    
        protected abstract CarShell buildCarShell();
    
        protected abstract Tire buildTire();
    
        protected abstract Engine buildEngine();
    }

    具体建造者

    public class ConcreteCarBuilder extends CarBuilder {
        @Override
        protected CarShell buildCarShell() {
            System.out.println("制造普通汽车外壳");
            return new CarShell();
        }
    
        @Override
        protected Tire buildTire() {
            System.out.println("制造普通汽车轮胎");
            return new Tire();
        }
    
        @Override
        protected Engine buildEngine() {
            System.out.println("制造普通汽车发动机");
            return new Engine();
        }
    }
    public class HighConcreteCarBuilder extends CarBuilder{
        @Override
        protected CarShell buildCarShell() {
            System.out.println("制造高配汽车外壳");
            return new CarShell();
        }
    
        @Override
        protected Tire buildTire() {
            System.out.println("制造高配汽车轮胎");
            return new Tire();
        }
    
        @Override
        protected Engine buildEngine() {
            System.out.println("制造高配汽车发动机");
            return new Engine();
        }
    }

    指挥者

    public class Director {
    
        private CarBuilder carBuilder;
    
        public Director() {
        }
    
        public Director(CarBuilder carBuilder) {
            this.carBuilder = carBuilder;
        }
    
        public void setCarBuilder(CarBuilder carBuilder){
            this.carBuilder = carBuilder;
        }
    
        public CarProduct buildCarProduct(){
            //如何装配在这里实现,装配顺序也在这里
            CarShell carShell = carBuilder.buildCarShell();
            Engine engine = carBuilder.buildEngine();
            Tire tire = carBuilder.buildTire();
            CarProduct carProduct = new CarProduct();
            carProduct.setCarShell(carShell);
            carProduct.setEngine(engine);
            carProduct.setTire(tire);
            System.out.println("装配完毕");
            return carProduct;
        }
    }

    最后客户端调用

    public class Client {
    public static void main(String[] args) {
    Director director = new Director(new ConcreteCarBuilder());
    director.buildCarProduct();
    Director director1 = new Director(new HighConcreteCarBuilder());
    director1.buildCarProduct();
    }
    }

    输出:

    "C:Program Files (x86)Javajdk1.8.0_101injava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2018.3.3libidea_rt.jar=54298:C:Program FilesJetBrainsIntelliJ IDEA 2018.3.3in" -Dfile.encoding=UTF-8 -classpath "C:Program Files (x86)Javajdk1.8.0_101jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_101jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_101jrelibextaccess-bridge-32.jar;C:Program File
    制造普通汽车外壳
    制造普通汽车发动机
    制造普通汽车轮胎
    装配完毕
    制造高配汽车外壳
    制造高配汽车发动机
    制造高配汽车轮胎
    装配完毕

    Process finished with exit code 0

      优点: 客户端不必知道产品内部的组成细节,将产品与产品的创建过程解耦,使得相同的创建过程可以实现不同的具体产品,每一个建造者相互独立,可以很方便替换原有建造者或者增加新的建造者,符合单一职能原则,指挥者使用聚合代替继承的方式去持有建造者,符合开闭原则和依赖倒置原则

      建造者模式所创建的产品一般具有较多的共同特点,其组成部分相似,具有相似的组装步骤,如果产品之间的差异性很大,则不适合使用建造者模式。如果产品的内部变化复杂,可能会导致定义多个具体的建造者去实现变化,导致系统变得很庞大,类的复杂度大大增加,这种情况也不适用建造者模式。

    建造者模式运用:

    JDK:  StringBuilder

    Mybatils:  SqlSessionFactoryBuilder  XmlConfigBuilder

    Spring:  BeanDefinitionBuilder

    建造者模式和工厂模式区别:

      建造者模式关注对象的创建过程或者步骤,而且必须是复杂对象,具有一定的构建步骤,这两点很关键

      工厂模式关注创建不同类型的对象

    总结:

    我们需要在具体的场景去使用对应的设计模式,当我们不知道是否应该使用设计模式时,可以考虑一下不使用该设计模式有什么问题,使用该设计模式又有什么好处,两者比对,综合利弊去衡量使用设计模式

  • 相关阅读:
    谈谈严格模式
    javascript回调函数那些事~
    border-radius:50%和100%究竟有什么区别
    canvas浅谈 实现简单的自旋转下落
    js中关于this的理解
    对js 面对对象编程的一些简单的理解
    ios中 input 焦点光标不垂直居中
    只能输入数字的正则表达式在火狐的兼容问题解决方法
    关于margin、padding 对内联元素的影响
    element ui 表格的合并
  • 原文地址:https://www.cnblogs.com/zhaoletian/p/12774541.html
Copyright © 2011-2022 走看看