呜呜,昨天鸽了一次,虽然是没人来看啦,但是希望能养成个好习惯吧,好像到毕业的时候,这里已经积攒了很多很多。

总之今天记录一下建筑者模式。

第三天,哈吉马路哟!

建筑者模式

上一篇我们讲到装饰模式,书中有写到它与建筑者有些相似,就自己的话说,装饰模式适用于动态地增加需求,而建筑者模式则偏向于一个步骤固定的对象生成。

举个例子好了,像是炒饭,他要放饭,放油,放盐,要是缺少任何一步都会产生一盆糟糕的炒饭。

建筑者模式就是为了避免你在构建同类但细节大不相同的对象生成中缺胳膊少腿的问题。

先看看总体的结构图吧

这里最重要的主体,就是Director,他指挥这对象的生成。

根据Construct()内Builder的类型不同,就能实现不同形状的同类个体呈现啦。

class Product
{
    Ilist<string> parts = new Ilist<string>();
    public void Add(string part)
    {
        parts.Add(part);
    }
    public void Show()
    {
        Console.WriteLine("\n产品 创建————");
        foreach (string part in parts)
        {
            Console.WriteLine(part);
        }
    }
}

class Builder
{
    protected Product product;
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public Product GetResult()
    {
        return product;
    }

}
class ConcreteBuildA : Builder
{
    public override void BuildPartA()
    {
        product.Add("A");
    }
    public override void BuildPartB()
    {
        product.Add("B");
    }
}
class ConcreteBuildB : Builder
{
    public override void BuildPartA()
    {
        product.Add("X");
    }
    public override void BuildPartB()
    {
        product.Add("Y");
    }
}

class Director
{
    public void Construct(Builder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
    }
}


// static void Main(string[] aoao)
// {
//     Director director=new Director();
//     ConcreteBuildA A=new ConcreteBuildA();
//     ConcreteBuildB B=new ConcreteBuildB();

//     director.Construct(A);
//     Product p1=A.GetResult();
//     p1.Show();
//     director.Construct(B);
//     Product p2=B.GetResult();
//     p2.Show();

// }

这里给出书中的具体例子

可以看到,这和大概的结构图是有些出入的,比如这里没有Product,而是把构建的过程全写进了一个函数里,我感觉也没什么不对的,所以说,还是要面对实际问题,再具体分析,切勿过度设计,有些不用写的坚决不写(doge),之后我再把代码打一下,找找手感~,那么今天就先到这里吧

——————————————————————————————————————————————

补上昨天的代码

abstract class PersonBuilder
{
    public abstract void BuildHead();
    public abstract void BuildBody();
    public abstract void BuildRightArm();
    public abstract void BuildLeftArm();
    public abstract void BuildRightLeg();
    public abstract void BuildLeftLeg();

}

class ConcretePersonA : PersonBuilder
{
    public override void BuildBody()
    {
        Debug.Log("bodyA");
    }
    public override void BuildLeftArm()
    {
        Debug.Log("LeftArmA");
    }
    public override void BuildHead()
    {
        Debug.Log("HeadA");
    }
    public override void BuildLeftLeg()
    {
        Debug.Log("LeftLegA");
    }
    public override void BuildRightArm()
    {
        Debug.Log("RightArmA");
    }
    public override void BuildRightLeg()
    {
        Debug.Log("RightLegA");
    }


}
class ConcretePersonB : PersonBuilder
{
    public override void BuildBody()
    {
        Debug.Log("bodyB");
    }
    public override void BuildLeftBrm()
    {
        Debug.Log("LeftBrmB");
    }
    public override void BuildHeBd()
    {
        Debug.Log("HeBdB");
    }
    public override void BuildLeftLeg()
    {
        Debug.Log("LeftLegB");
    }
    public override void BuildRightBrm()
    {
        Debug.Log("RightBrmB");
    }
    public override void BuildRightLeg()
    {
        Debug.Log("RightLegB");
    }


}

//!!!重点!!!
class PersonDirector
{
    private PersonBuilder pb;
    public PersonDirector(PersonBuilder pb)
    {
        this.pd = pb;
    }

    public void CreatePerson()
    {
        pb.BuildHead();
        pb.BuildBody();
        pb.BuildRightArm();
        pb.BuildLeftArm();
        pb.BuildRightLeg();
        pb.BuildLeftLeg();
    }
}

// ConcretePersonA a = new ConcretePersonA();
// PersonDirector pdA = new PersonDirector(a);
// pda.CreatePerson();
// ConcretePersonB b = new ConcretePersonB();
// PersonDirector pdB = new PersonDirector(b);
// pdB.CreatePerson();

您必须 登录 才能发表评论