• 再战设计模式(三)之建造者模式


    建造者模式

    他的本质主要是:

    分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用

    建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

    由于实现了构建和装配的解耦。不同的构建器和不同的装配器 可以组合成很多不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用

    场景:

     在日常开发中,有时候我们需要一个复杂的对象.由于需求的原因.但是其中各部分的子对象经常变化,但是我们可以让他们组合起来相对简单稳定

    使用场景. 1.我们需要很多零件 2.我们要把这些零件组装起来 当然在工作中,可能要和工厂模式搭配起来使用

    代码:

    这些实例可以使用简单工厂模式来生成不同的发动机 座椅啊.轮胎啊.

    /**
     * 汽车
     * @Created by xiaodao
     */
    public class Car {
    
        private Seat seat;
        private Engine engine;//发动机
    
        private Tyre tyre;//轮胎
    
    
    
        public Car(Seat seat, Engine engine, Tyre tyre) {
    
            this.seat = seat;
            this.engine = engine;
            this.tyre = tyre;
        }
    
        public Seat getSeat() {
            return seat;
        }
    
        public void setSeat(Seat seat) {
            this.seat = seat;
        }
    
        public Engine getEngine() {
            return engine;
        }
    
        public void setEngine(Engine engine) {
            this.engine = engine;
        }
    
        public Tyre getTyre() {
            return tyre;
        }
    
        public void setTyre(Tyre tyre) {
            this.tyre = tyre;
        }
    }
    
    /**
     * @Created by xiaodao
     * 引擎实例
     */
    public class Engine {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Engine(String name) {
            this.name = name;
        }
    }
    
    
    /**
     * @Created by xiaodao
     * 座椅
     */
    public class Seat {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Seat(String name) {
            this.name = name;
        }
    }
    
    /**
     * @Created by xiaodao
     *轮胎
     */
    public class Tyre {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Tyre(String name) {
            this.name = name;
        }
    }

    builder接口:

    /**
     * @Created by xiaodao
     * 构建接口 这里也可以是抽象方法
     */
    public interface CarBuilder {
    
        /**
         * 构建引擎
         *
         * @return
         */
        Engine builderEngine();
    
        Seat builderSeat();
    
        Tyre builderTyre();
    }

    builder实现类:

    /**
     * @Created by xiaodao
     */
    public class AudiCarBuilderImpl implements CarBuilder {
        @Override
        public Engine builderEngine() {
            return new Engine("奥迪引擎");
        }
    
        @Override
        public Seat builderSeat() {
            return new Seat("奥迪座椅");
        }
    
        @Override
        public Tyre builderTyre() {
            return new Tyre("奥迪轮胎");
        }
    }

    direactor:用来引入builder类的引用.他不知道builder的子类是什么

    /**
     * @Created by xiaodao
     */
    public class CarDirector {
    
        private CarBuilder builder;
    
        public CarDirector(CarBuilder builder) {
            this.builder = builder;
        }
    
        /**
         * 装配汽车
         * @return
         */
        public Car directCar(){
    
            Engine engine = builder.builderEngine();
            Seat seat = builder.builderSeat();
            Tyre tyre = builder.builderTyre();
            return new Car(seat,engine,tyre);
        }
    }

    调用者:

    public class Client {
        public static void main(String[] args) {
    
            CarDirector carDirector = new CarDirector(new AudiCarBuilderImpl());
            Car car = carDirector.directCar();
            System.out.println(car.getEngine().getName());
            System.out.println(car.getSeat().getName());
            System.out.println(car.getTyre().getName());
        }
    }

    奥迪引擎
    奥迪座椅
    奥迪轮胎

    类图:

    登场角色

    builder角色负责定义用户生成实例的接口 

    concreteBuilder(具体的builder) concreteBuilder角色是实现了Builder接口的类.定义了具体的方法

    director(监工) 负责使用builder角色的接口来生成实例,他不依赖与Builder的子类 无论子类如何定义都不影响 director的使用

    client 具体的调用者 

    这里我们可以把car 的各种属性变成工厂模式 

    总结:

    建造者模式与抽象工厂模式相似.(director 和abstractFactory 的实现类)今天下午与同事讨论半天总是在这方面比较模糊.欢迎大家踊跃评论.

    个人感觉工厂模式是用于创建什么样的对象

    建造模式就用来怎么创建对象

    工厂方法模式和建造者模式都属于对象创建类模式,都用来创建类的对象。但它们之间的区别还是比较明显的。  

    下面来自某位群友的讲解

     ● 意图不同  

       在工厂方法模式里,我们关注的是一个产品整体,如超人整体,无须关心产品的各部分是如何创建出来的;但在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”。简单地说,工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程。  

     ● 产品的复杂度不同   

      工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。这不是说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。   两者的区别有了,那在具体的应用中,我们该如何选择呢?是用工厂方法模式来创建对象,还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。

  • 相关阅读:
    <大学祭>
    使用rest方式修改服务端xml文件
    tsql的奇特语法
    Dandelion
    正则中关于修饰符g以及exec和match区别的一个小demo
    如何将一个盒子在显示在浏览器的正中间
    Js中的this指向问题
    CSS通过边框border-style来写小三角
    用单例模式封装常用方法 utils class v1.0
    JS中检测数据类型的四种方法
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10831441.html
Copyright © 2020-2023  润新知