建造者模式 指挥者的作用

来源:互联网 发布:java获取图片的宽和高 编辑:程序博客网 时间:2024/05/05 12:25


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

主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。


用了建造者模式,用户只需指定需要建造的类型就可以得到它们,而具体的过程和细节就不需要知道了。
而建造者中的一个非常重要的类就是指挥者类,它用来控制建造过程,也用它来隔离用户与建造过程的关联。

指挥者类是建造模式的核心和灵魂所在,主要完成同样的构建过程可以创建不同的表示。从上面的例子可以看到,如果缺少指挥者类,那么就不能算是建造者模式了,只能说是定义了一个接口或抽象类,规定了必须实现哪些功能罢了。指挥者类,不仅指出了对象的建造顺序,还把用户与建造过程分离,并为可能发生的变化提供了一个灵活的处理方法,使建造顺序的改变或需求的改变不会引起大的改动也不会改变程序的结构。

创建者例子:
 static void Main(string[] args)
        {
            PersonBuilder fatPerson = new FatPerson();
            directorA dr = new directorA(fatPerson);
            Person p = fatPerson.GetResult();
            p.Show();
            Console.Read();
        }

//建造者模式
//要被创建的对象
public class Person
{
    List<string> parts = new List<string>();
    public void Add(string part)
    {
        parts.Add(part);
    }
    public void Show()
    {
        parts.ForEach(str=>Console.WriteLine(str));
    }
}
/// <summary>
/// 小人创建者
/// </summary>
public abstract class PersonBuilder
{
    public abstract void builderHeader(); //创建头
    public abstract void builderHand();   //创建手
    public abstract Person GetResult();
}
/// <summary>
/// 胖小人,完成具体的创建细节
/// </summary>
public class FatPerson : PersonBuilder
{
    Person per = new Person();
    public override void builderHeader()
    {
        per.Add("创建胖人的胖头!");
    }
    public override void builderHand()
    {
        per.Add("创建胖人的大手!");
    }
    public override Person GetResult()
    {
        return per;
    }
}
/// <summary>
/// 瘦小人,完成具体的创建细节
/// </summary>
public class ThinPerson : PersonBuilder
{
    Person per = new Person();
    public override void builderHeader()
    {
        per.Add("创建瘦人的小头!");
    }
    public override void builderHand()
    {
        per.Add("创建瘦人的小手!");
    }
    public override Person GetResult()
    {
        return per;
    }
}
/// <summary>
/// 指挥者,完成对创建顺序的控制,完成创建过程的分离
/// </summary>
public class directorA
{
    public directorA(PersonBuilder builder)
    {
        builder.builderHand();
        builder.builderHeader();
    }
}
0 0
原创粉丝点击