设计模式学习笔记之 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#设计模式纵横谈   李建忠   


     回到目录

posted on 2006-09-10 16:19  aiya  阅读(237)  评论(0)    收藏  举报