zoukankan      html  css  js  c++  java
  • 设计模式之笔记--建造者模式(Builder)

    建造者模式(Builder)

    定义

           建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    类图

    描述

    Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造。这个接口规定要实现对象的哪些部分的创建,并不涉及具体的对象部件的创建。

    ConcreteBuilder:继承Builder,针对不同的业务逻辑,具体化对象的各部分的创建。在建造过程完成后,提供产品的实例。

    Director:调用具体建造者来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

    Product:要创建的对象。

    建造者模式仅仅只比工厂模式多了一个"Director类"的角色。

    应用场景

          以生产轿车为例,建造者负责生产汽车的各个部件,而指挥者负责指挥建造者按流程组装轿车。

        /// <summary>
        /// 发动机
        /// </summary>
        public class Engine
        {
            public string Description { get; set; }
        }
    
        /// <summary>
        /// 车体结构
        /// </summary>
        public class Body
        {
            public string Description { get; set; }
        }
    
        /// <summary>
        /// 车轮
        /// </summary>
        public class Wheel
        {
            public string Description { get; set; }
        }
    
        /// <summary>
        /// 汽车
        /// </summary>
        public class Car
        {
            public Body body { get; set; }
            public Engine engine { get; set; }
            public Wheel wheel { get; set; }
        }
    
        /// <summary>
        /// 建造者接口
        /// </summary>
        public interface IBuilder
        {
            void BuildBody();
            void BuildEngine();
            void BuildWheel();
            Car CreateCar();
        }
    
        /// <summary>
        /// 奥迪建造者
        /// </summary>
        public class BuilderAudi : IBuilder
        {
            private Car car = new Car();
    
            public void BuildBody()
            {
                car.body = new Body() { Description = "奥迪的车身结构." };
                Console.WriteLine(string.Format("安装{0}", car.body.Description));
            }
    
            public void BuildEngine()
            {
                car.engine = new Engine() { Description = "奥迪的发动机." };
                Console.WriteLine(string.Format("安装{0}", car.engine.Description));
            }
    
            public void BuildWheel()
            {
                car.wheel = new Wheel() { Description = "奥迪的车轮." };
                Console.WriteLine(string.Format("安装{0}", car.wheel.Description));
            }
    
            public Car CreateCar()
            {
                Console.WriteLine("奥迪车安装完成.");
                return car;
            }
        }
    
        /// <summary>
        /// 奔驰建造者
        /// </summary>
        public class BuilderBenz : IBuilder
        {
            private Car car = new Car();
    
            public void BuildBody()
            {
                car.body = new Body() { Description = "奔驰的车身结构." };
                Console.WriteLine(string.Format("安装{0}", car.body.Description));
            }
    
            public void BuildEngine()
            {
                car.engine = new Engine() { Description = "奔驰的发动机." };
                Console.WriteLine(string.Format("安装{0}", car.engine.Description));
            }
    
            public void BuildWheel()
            {
                car.wheel = new Wheel() { Description = "奔驰的车轮." };
                Console.WriteLine(string.Format("安装{0}", car.wheel.Description));
            }
    
            public Car CreateCar()
            {
                Console.WriteLine("奔驰车安装完成.");
                return car;
            }
        }
    
        /// <summary>
        /// 指挥者
        /// </summary>
        public class Director
        {
            public void Constrcut(IBuilder builder)
            {
                builder.BuildBody();
                builder.BuildEngine();
                builder.BuildWheel();
            }
        }
  • 相关阅读:
    JAVA中“==”和equals
    C++中各种容器的类型与特点
    程序员面试宝典 笔记 第七章
    程序员面试宝典 笔记(第六章 预处理 const 和sizeof())
    某学长面经
    tomcat 启动日志乱码
    Jenkins关闭和重启实现方式
    linux下svn版本控制的常用命令大全
    Java中的增强 for 循环 foreach
    JS 中 cookie 的使用
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/5318489.html
Copyright © 2011-2022 走看看