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

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

    在之前的工厂模式中,用户为了获得Car,需要和引擎(Engine)和轮胎(Tyre)打交道。可是我们不希望把车子内部的实现告诉用户,只希望用户需要Car时,把Car给他,这样,我们就引入了建造者模式。

    建造者模式主要的目的是为了解除创建和装配的耦合,通过使用Builder类来控制所有组建的创建,Director类来进行组件的装配,只需要对用户开放Director接口,用户就可以直接获得完整的产品。只和Car打交道,而不和Engine和Tyre打交道。

    创建car类和相应的组件:引擎(Engine)和轮胎(Tyre)

     1 package top.bigking.builder;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/11 上午11:07
     6  **/
     7 public class Car {
     8     private Engine engine;
     9     private Tyre tyre;
    10 
    11     public void run(){
    12         System.out.println("车子在跑");
    13     }
    14     public Engine getEngine() {
    15         return engine;
    16     }
    17 
    18     public void setEngine(Engine engine) {
    19         this.engine = engine;
    20     }
    21 
    22     public Tyre getTyre() {
    23         return tyre;
    24     }
    25 
    26     public void setTyre(Tyre tyre) {
    27         this.tyre = tyre;
    28     }
    29 }
    30 class Engine{
    31     private String name;
    32 
    33     public Engine(String name) {
    34         this.name = name;
    35     }
    36 
    37     public String getName() {
    38         return name;
    39     }
    40 
    41     public void setName(String name) {
    42         this.name = name;
    43     }
    44 }
    45 class Tyre{
    46     private String name;
    47 
    48     public Tyre(String name) {
    49         this.name = name;
    50     }
    51 
    52     public String getName() {
    53         return name;
    54     }
    55 
    56     public void setName(String name) {
    57         this.name = name;
    58     }
    59 }

    接下来写Builder接口和Director接口:

     1 package top.bigking.builder;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/11 上午11:10
     6  **/
     7 public interface CarBuilder {
     8     public Engine buildEngine();
     9     public Tyre buildTyre();
    10 }
    1 package top.bigking.builder;
    2 
    3 /**
    4  * @Author ABKing
    5  * @Date 2020/2/11 上午11:10
    6  **/
    7 public interface CarDirector {
    8     public Car directCar();
    9 }

    为了获得我们的产品——车,我们需要实现这两个接口:

     1 package top.bigking.builder;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/11 上午11:17
     6  **/
     7 public class BigKingCarBuilder implements CarBuilder {
     8     @Override
     9     public Engine buildEngine() {
    10         System.out.println("建造发动机");
    11         return new Engine("发动机");
    12     }
    13 
    14     @Override
    15     public Tyre buildTyre() {
    16         System.out.println("建造轮胎");
    17         return new Tyre("轮胎");
    18     }
    19 }
     1 package top.bigking.builder;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/11 上午11:21
     6  **/
     7 public class BigKingCarDirector implements CarDirector {
     8     private CarBuilder carBuilder;
     9 
    10     public BigKingCarDirector(CarBuilder carBuilder) {
    11         this.carBuilder = carBuilder;
    12     }
    13 
    14     @Override
    15     public Car directCar() {
    16         Engine engine = carBuilder.buildEngine();
    17         Tyre tyre = carBuilder.buildTyre();
    18 
    19         Car car = new Car();
    20         car.setEngine(engine);
    21         car.setTyre(tyre);
    22         return car;
    23     }
    24 }

    测试类如下:

     1 package top.bigking.builder;
     2 
     3 import org.junit.Test;
     4 
     5 /**
     6  * @Author ABKing
     7  * @Date 2020/2/11 下午2:18
     8  **/
     9 public class TestBuilder {
    10     @Test
    11     public void testBuilder(){
    12         CarDirector carDirector = new BigKingCarDirector(new BigKingCarBuilder());
    13         Car car = carDirector.directCar();
    14         car.run();
    15     }
    16 }
    金麟岂是池中物,一遇风云便化龙!
  • 相关阅读:
    挂载在snap的/dev/loop占用100%问题
    机器学习3- 一元线性回归+Python实现
    机器学习-2 模拟评估与选择
    机器学习-1 绪论
    Java面试系列第4篇-HashMap相关面试题
    Java面试系列第3篇-类的加载及Java对象的创建
    Java面试系列第2篇-Object类中的方法
    Java面试系列第1篇-基本类型与引用类型
    第3篇-如何编写一个面试时能拿的出手的开源项目?
    第2篇-如何编写一个面试时能拿的出手的开源项目?
  • 原文地址:https://www.cnblogs.com/ABKing/p/12295010.html
Copyright © 2011-2022 走看看