技术开发 频道

基于反射和属性的Builder模式实现


C# 经典Builder模式实现
public class House
{
public void AddWindowAndDoor() { }
public void AddWallAndFloor() { }
public void AddCeiling() { }
}
public class Car 
{
public void AddWheel() { }
public void AddEngine() { }
public void AddBody() { }
}
public interface IBuilder 
{
void BuildPart1();
void BuildPart2();
void BuildPart3();
}
public class CarBuilder : IBuilder
{
private Car car;
public void BuildPart1() { car.AddEngine(); }
public void BuildPart2() { car.AddWheel(); }
public void BuildPart3() { car.AddBody(); }
public Car GetResult() { return car; }
}
public class HouseBuilder : IBuilder
{
private House house;
public void BuildPart1() { house.AddWallAndFloor(); }
public void BuildPart2() { house.AddWindowAndDoor(); }
public void BuildPart3() { house.AddCeiling(); }
public House GetResult() { return house; }
}
public class Director
{
public void Construct(IBuilder builder) //指导IBuilder的创建过程
{
builder.BuildPart1();
builder.BuildPart2();
builder.BuildPart3();
}
}
    区别于之前的各个设计模式,您可能发现这里的产品类型并没有用一个IProduct表示,主要原因是因为经过不同ConcreteBuilder加工后的产品差别相对较大,给他一个公共的基准抽象对象意义不大,而且您可以看到GetResult()这个方法仅仅位于实体类中。但是实际项目中,我们之所以使用创建者模式往往都是有很明确的意图,主要用它来加工某一类产品,只不过系统通过不同的中间步骤“锻造”后,具体组成上有所不同。相对而言前一种情况一般需要创建者定义的步骤非常宽泛,后一种情况由于加工的产品类型比较明确,所以创建者定义的每个BuildPart()相对也更专注于这类产品。

    通过上面对经典创建者模式的实现我们不难发现使用它有很明显的优势,但也很容易引出不利的影响。

优势:

创建者模式将复杂对象每个组成的创建步骤暴露出来,借助Director(或客户程序自己)既可以选择其执行次序,也可以选择要执行那些步骤。上述过程可以在应用中动态完成,相比较工厂方法和抽象工厂模式的一次性创建过程而言,创建者模式适合创建“更为复杂且每个组成变化较多”的类型;

 向客户程序屏蔽了对象创建过程的多变性(相对工厂方法和抽象工厂模式而言,创建者模式在这方面更为明显);

 构造过程的最终成果可以根据实际变化的情况,选择使用一个统一的接口,或者是不同类的对象,给客户类型更大的灵活度;

劣势:

    相对而言创建者模式会暴露出更多的执行步骤,需要Director(或客户程序)具有更多的领域知识,因此使用不慎很容易造成相对更为紧密的耦合;

0
相关文章