zoukankan      html  css  js  c++  java
  • C#设计模式——生成器模式(Builder Pattern)

    一、概述
    在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的。生成器模式可以处理这类对象的构建,它提供了一种封装机制来隔离各类子对象的变化,从而保证系统的稳定。
    二、生成器模式
    生成器模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。其结构图如下:

    Builder为创建Product对象的各个子对象指定抽象接口。
    ConcreteBuilder实现了Builder接口,用于创建Product对象的各个子对象。
    Director使用Builder来创建Product对象。
    Product表示被构造的复杂对象。
    三、示例
    我们以普通汽车和高级汽车的创建为例来展示一下生成器模式的应用。
    首先创建抽象的Builder

    1     interface ICarBuilder
    2     {
    3         void BuilderWheels();
    4         void BuilderWindows();
    5     }

    接着创建普通汽车的Builder和高级汽车的Builder

     1     public class BasicBuilder : ICarBuilder
     2     {
     3         public void BuilderWheels()
     4         {
     5             Console.WriteLine("Builder Basic Wheels");
     6         }
     7 
     8         public void BuilderWindows()
     9         {
    10             Console.WriteLine("Builder Basic Windows");
    11         }
    12     }
    13 
    14     public class AdvancedBuilder : ICarBuilder
    15     {
    16         public void BuilderWheels()
    17         {
    18             Console.WriteLine("Builder Advanced Wheels");
    19         }
    20 
    21         public void BuilderWindows()
    22         {
    23             Console.WriteLine("Builder Advanced Windows");
    24         }
    25     }

    然后创建汽车建造工厂,它使用Builder来创建不同种类的汽车

     1     class CarFactory
     2     {
     3         public ICarBuilder Builder { get; set; }
     4 
     5         public CarFactory(ICarBuilder builder)
     6         {
     7             Builder = builder;
     8         }
     9 
    10         public void CreateCar()
    11         {
    12             Builder.BuilderWheels();
    13             Builder.BuilderWindows();
    14         }
    15     }

    最后看一下如何调用

    1     static void Main(string[] args)
    2     {
    3         CarFactory game = new CarFactory(new BasicBuilder());
    4         game.CreateCar();
    5         game.Builder = new AdvancedBuilder();
    6         game.CreateCar();
    7         Console.ReadLine();
    8     } 
  • 相关阅读:
    layui table中省略号展开,弹框拖动会错位问题
    layui table分页 page为false时,limit问题
    layui 表格在排序之后没有重新渲染问题
    基于jQuery的控件:弹框
    layui layer弹框中表格的显示
    layui select使用问题
    页面强制横屏
    linux下常用命令
    文字超出省略号显示
    Web Notification简单实现桌面消息通知(右下角提示)
  • 原文地址:https://www.cnblogs.com/saville/p/2547475.html
Copyright © 2011-2022 走看看