上一个章节简单工厂模式中,如果增加产品C,那么则需要修改工厂类的逻辑代码。如果这种情形发生在现实中,我们的解决方案是,增加产品C,增加生产产品C的工厂就可以了。修改工厂类的逻辑显然是不合理的。如果按照单一职责的原则,工厂应该只负责相应产品的生产,而不应该根据类别生产产品,换句话说就是工厂应该职责单一化,按照这种思路,我们针对每一种产品建立工厂。我们再在具体工厂的基础上抽象出一个类出来,这样就能够实现增加产品时,只需要增加相应的工厂,不需要改动工厂类代码。
抽象工厂在简单工程的基础上,进一步解决了扩展时需要修改工厂类逻辑代码的问题。解决方式是工厂职责明确化,再抽提工厂类。
ProductFactory
namespace SimpleFactory
{
public abstract class ProductFactory
{
public abstract Product CreateProduct();
}
}
ProductAFactory
namespace SimpleFactory
{
public class ProductAFactory : ProductFactory
{
public override Product CreateProduct()
{
return new ProductA();
}
}
}
ProductBFactory
namespace SimpleFactory
{
public class ProductBFactory : ProductFactory
{
public override Product CreateProduct()
{
return new ProductB();
}
}
}
调用者:
ProductFactory factory = null;
factory = new ProductAFactory();
factory.CreateProduct();
factory = new ProductBFactory();
factory.CreateProduct();
Console.ReadKey();
其他代码不动,这样如果增加产品,我们只需要增加相应工厂,
这个已经能够满足SOLID原则的单一职责原则和对扩展开放,对修改封闭的原则。
ProductA
public class ProductA:Product
{
public ProductA()
{
Console.WriteLine("ProductA created.");
}
}
ProductB类似
抽象工厂模式将逻辑划分为产品层, 工厂层,抽象工厂层。这里我们得出一条结论:
if...else.switch这样的分支判断都是可以通过设计模式来分解的。