建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时使用的模式。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式又称生成器模式。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,二聚体建造的过程和细节就不需要知道了。
基本代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace 建造者模式
{
class Program
{
static void Main(string[] args)
{
Director director = new Director();//指挥者
Builder b1 = new ConcreteBuilder1();//建造者b1
Builder b2 = new ConcreteBuilder2();//建造者b2
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
director.Construct(b2); //由b2建造者建造,执行建造过程
Product p2 = b2.GetResult();//获取建造者b2的建造结果:产品p2
p2.Show();//产品展示
Console.Read();
}
}
//指挥者 建造顺序通常是稳定的 是构建一个使用建造者Builder接口的对象
class Director
{ //建造过程: 传入(建造者)
public void Construct(Builder builder)
{
builder.BuildPartA();//建造者 建造部件A
builder.BuildPartB();//建造者 建造部件B
}
}
//抽象类: 建造者
abstract class Builder
{
public abstract void BuildPartA();//建造部件A
public abstract void BuildPartB();//建造部件B
public abstract Product GetResult();//获取建造结果:产品
}
//建造者1 具体建造者,实现Builder接口
class ConcreteBuilder1 : Builder
{
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;
}
}
//建造者2
class ConcreteBuilder2 : Builder
{
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;
}
}
//建造的结果:产品 具体产品
class Product
{
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);
}
}
}
}
建造小人-建造者模式: WinForm
private void button1_Click(object sender, EventArgs e)
{
Pen p = new Pen(Color.Yellow);
PersonDirector pdThin = new PersonDirector("Thin",pictureBox1.CreateGraphics(),p);
pdThin.CreatePerson();
PersonDirector pdFat = new PersonDirector("Fat", pictureBox2.CreateGraphics(), p);
pdFat.CreatePerson();
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Reflection;
//PersonBuilder.cs
namespace 建造者模式
{ //小人建造者:抽象类
abstract class PersonBuilder //
{
protected Graphics g;
protected Pen p;
public PersonBuilder(Graphics g, Pen p)
{
this.g = g;
this.p = p;
}
public abstract void BuildHead();
public abstract void BuildBody();
public abstract void BuildArmLeft();
public abstract void BuildArmRight();
public abstract void BuildLegLeft();
public abstract void BuildLegRight();
}
//瘦人建造者:具体类1
class PersonThinBuilder : PersonBuilder
{
public PersonThinBuilder(Graphics g, Pen p)
: base(g, p)
{ }
public override void BuildHead()
{
g.DrawEllipse(p, 50, 20, 30, 30);
}
public override void BuildBody()
{
g.DrawRectangle(p, 60, 50, 10, 50);
}
public override void BuildArmLeft()
{
g.DrawLine(p, 60, 50, 40, 100);
}
public override void BuildArmRight()
{
g.DrawLine(p, 70, 50, 90, 100);
}
public override void BuildLegLeft()
{
g.DrawLine(p, 60, 100, 45, 150);
}
public override void BuildLegRight()
{
g.DrawLine(p, 70, 100, 85, 150);
}
}
//胖人建造者:具体类2
class PersonFatBuilder : PersonBuilder
{
public PersonFatBuilder(Graphics g, Pen p)
: base(g, p)
{ }
public override void BuildHead()
{
g.DrawEllipse(p, 50, 20, 30, 30);
}
public override void BuildBody()
{
g.DrawEllipse(p, 45, 50, 40, 50);
}
public override void BuildArmLeft()
{
g.DrawLine(p, 50, 50, 30, 100);
}
public override void BuildArmRight()
{
g.DrawLine(p, 80, 50, 100, 100);
}
public override void BuildLegLeft()
{
g.DrawLine(p, 60, 100, 45, 150);
}
public override void BuildLegRight()
{
g.DrawLine(p, 70, 100, 85, 150);
}
}
//建造小人指挥者
class PersonDirector
{
private PersonBuilder pb;//建造者类型
//指挥者构造函数: type:Thin Fat
public PersonDirector(string type, Graphics g, Pen p)
{
string assemblyName="建造者模式";
object[] args = new object[2];
args[0] = g;
args[1] = p;
//反射 创建建造者的一个实例
this.pb = (PersonBuilder)Assembly.Load(assemblyName).CreateInstance(assemblyName+".Person" + type + "Builder", false, BindingFlags.Default, null, args, null, null);
}
//建造过程
public void CreatePerson()
{
pb.BuildHead();
pb.BuildBody();
pb.BuildArmLeft();
pb.BuildArmRight();
pb.BuildLegLeft();
pb.BuildLegRight();
}
}
}