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

    前言

    同设计模式系列上篇设计模式---抽象工厂一样,建造者模式也属于创建型模式,用于在使用者和产品之间加入中间代理,使用中间代理进行实现具体创建细节。让我再简单回顾一下抽象工厂,使用者依赖于抽象工厂构建抽象产品,具体产品的实现细节可以在具体工厂中进行创建

    那么问题来了

    可以想象,既然是工厂,那应该是一个比较大粒度的接口层了。现在的情况是,如果在具体工厂中生产产品时,加入生产具体产品的环节很多,一个产品可能要经过Step1、Step2、Step3等多个步骤完成,那么,在不影响工厂的接口之下,我们是否能对具体工厂的实现细节来做良好的设计呢?OK,这就是本篇要讲的主题了。建造者模式在上层和工厂的接口很相似,都是提供抽象创建接口和抽象产品。但是请注意,我理解的建造者模式是在更细粒度的控制上,针对具体产品实现进行细分。请看详细分解

    UML图解

    且听我分解:

    • 产品类,提供产品定义
    • 抽象建造者,负责提供建造方法抽象接口,此接口可以为带参数的泛型接口,或者提供多个建造方法接口
    • 具体建造者,负责实现抽象建造方法接口,对产品进行装饰
    • 装配者,这里的Director我称为装配者,它拥有建造者抽象接口,在装配方法中调用建造者接口的建造方法对产品进行构造,这里的作用就是可以自由组合不同的建造方法和顺序,所以这个过程我把它称为装配的过程

    代码

    产品定义

    public class Product
    {
        public string Part1 { get; set; }
        public string Part2 { get; set; }
        public string Part3 { get; set; }
    
        public override string ToString()
        {
            return "Part1: " + Part1
                + Environment.NewLine
                + "Part2: " + Part2
                + Environment.NewLine
                + "Part3: " + Part3;
        }
    }

    抽象建造者

    public abstract class ProductBuilder
    {
        public abstract void BuildStep1();
        public abstract void BuildStep2();
        public abstract void BuildStep3();
    
        public abstract Product GetProduct();
    }

    具体建造者

    public class ConcreteBuilder : ProductBuilder
    {
        private Product product = new Product();
    
        public override void BuildStep1()
        {
            product.Part1 = "Step1 Finished";
        }
    
        public override void BuildStep2()
        {
            product.Part2 = "Step2 Finished";
        }
    
        public override void BuildStep3()
        {
            product.Part3 = "Step3 Finished";
        }
    
        public override Product GetProduct()
        {
            return product;
        }
    }

    装配者Director

    public class Director
    {
        private ProductBuilder builder = new ConcreteBuilder();
    
        public Product Assemble()
        {
            builder.BuildStep1();
            builder.BuildStep2();
            builder.BuildStep3();
    
            return builder.GetProduct();
        }
    }

    输出

    static void Main(string[] args)
    {
        Director director = new Director();
        Product p = director.Assemble();
        Console.WriteLine(p);
    
        Console.ReadKey();
    }

    image

  • 相关阅读:
    reset内容
    如何在鼠标悬停时图片旁边出现详情说明模块
    从零学习Entity Framework
    一款程序员用的小说下载器
    实习笔记(数据库相关)-2014
    ASP.NET json数据的序列化与反序列化
    不使用服务器控件的ASP.NET
    win7 下先装SQL2005 后装SQL2000 解决方案
    Jquery 插件封装成seajs的模块
    前端模块化实践——seajs的使用
  • 原文地址:https://www.cnblogs.com/fecktty2013/p/designpatterns-builder.html
Copyright © 2011-2022 走看看