建造者模式(Builder):Builder是为创建一个Product对象的各个部件指定的抽象接口;
ConcreteBuilder是具体创建者,构造和装配各个部件。
Director是构造一个使用Builder接口的对象。
使用场合:主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常都是稳定的,但对象内部的构造通常面临着复杂的变化。建造者的好处是使得建造代码与表示代码分离,由于建造者隐藏了产品是如何组装的,所以要改变一个产品的内部表示,只需要再定义一个建造者就可以了。
建造者模式是在当创造复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
- using System;
- using System.Collections.Generic;
- namespace StuDesignMode.Builder
- {
- /// <summary>
- /// 产品
- /// </summary>
- class Product
- {
- private IList<string> _parts = new List<string>();
- public void Add(string part)
- {
- _parts.Add(part);
- }
- public void Show()
- {
- Console.WriteLine("/n产品 创建--------");
- foreach (string part in _parts)
- {
- Console.WriteLine(part);
- }
- }
- }
- /// <summary>
- /// 抽象建造者
- /// </summary>
- abstract class AbsBuilder
- {
- public abstract void BuildPartA();
- public abstract void BuildPartB();
- public abstract Product GetResult();
- }
- /// <summary>
- /// 具体建造者
- /// </summary>
- class ConcreteBuilder1:AbsBuilder
- {
- private Product product = new Product();
- public override void BuildPartA()
- {
- product.Add("部件A");
- }
- public override void BuildPartB()
- {
- product.Add("部件B");
- }
- public override Product GetResult()
- {
- return product;
- }
- }
- class ConcreteBuilder2 : AbsBuilder
- {
- private Product product = new Product();
- public override void BuildPartA()
- {
- product.Add("部件X");
- }
- public override void BuildPartB()
- {
- product.Add("部件Y");
- }
- public override Product GetResult()
- {
- return product;
- }
- }
- /// <summary>
- /// 指挥者
- /// </summary>
- class Director
- {
- public void Construct(AbsBuilder builder)
- {
- builder.BuildPartA();
- builder.BuildPartB();
- }
- }
- public class ClientTest
- {
- static void Main(string[] args)
- {
- //指挥者
- Director direcotr = new Director();
- AbsBuilder builder1 = new ConcreteBuilder1();
- //指定建造模型
- direcotr.Construct(builder1);
- //得到模型生产出的产品
- Product p1 = builder1.GetResult();
- p1.Show();
- AbsBuilder builder2 = new ConcreteBuilder2();
- direcotr.Construct(builder2);
- Product p2 = builder2.GetResult();
- p2.Show();
- }
- }
- }