设计模式学习笔记之 Abstract Factory
Abstract Factory 即抽象工厂模式,是用来应对不同系列之间的变化。一般来说,不同系列间的各个对象都存在着耦合的关系,是相互依赖的。Abstract Factory提供一个接口,该接口可以提供一系列创建这系列类的方法。
abstract class ProductA
{
public abstract void AFunction();
}
abstract class ProductB
{
public abstract void BFunction();
}
abstract class AbstractFactory
{
abstract public ProductA CreatA();
abstract public ProductB CreatB();
}
例如从上面这段程序中,“一系列”指的就是创建ProductA和ProductB,而每个系列都存在不同的ProductA和ProductB,它们之间是有耦合关系的。
//ProductA B中的一个系列
class No1ProductA : ProductA
{
public override void AFunction()
{
Console.WriteLine("A1");
}
}
class No1ProductB : ProductB
{
public override void BFunction()
{
Console.WriteLine("B1");
}
}
class No1Factory : AbstractFactory
{
public override ProductA CreatA()
{
return new No1ProductA();
}
public override ProductB CreatB()
{
return new No1ProductB();
}
}
//ProductA B中的另一个系列
class No2ProductA : ProductA
{
public override void AFunction()
{
Console.WriteLine("A2");
}
}
class No2ProductB : ProductB
{
public override void BFunction()
{
Console.WriteLine("B2");
}
}
class No2Factory : AbstractFactory
{
public override ProductA CreatA()
{
return new No2ProductA();
}
public override ProductB CreatB()
{
return new No2ProductB();
}
}
上面这段代码省略了同一系列的ProductA和ProductB之间的耦合关系。可以看到存在2个系列,分别为No1Product系列和No2Product系列,每个系列都包含A,B两种product。它们分别继承自抽象类ProductA和ProductB。同时有分别对应两个系列的Factory,也继承自抽象类AbstractFactory。这样在调用的时候
只要在该类的构造函数中传递不同的参数,就可以用来创建不同的系列
Manager myManager = new Manager(myFactory);如果myFactory为No1Factory,调用myManager.Builing()就可以创建No1系列的Product,同理,使用No2Factory就可以在myManager.Builing()时创建No2系列。当系列之间经常要发生变化时,只要修改为对应的Factory即可。我们还可以利用反射,将其写入配置文件,这样我们就可以不修改代码,仅通过修改构造文件就可以达到在系列间变化的目的。
AbstractFactory myFactory = (AbstractFactory)Assembly.Load(assemblyName).CreateInstance(factoryName);
Abstract Factory无法应对新对象的情况。例如现在出现了ProductC,对于Abstract Factory来说就很难应对,几乎所有代码都要修改,对于对象频繁改变的情况不应单独使用Abstract Factory。
参考 MSDNWebCast C#设计模式纵横谈 李建忠
回到目录

浙公网安备 33010602011771号