设计模式之抽象工厂模式

10/21/2012 5:14:51 PM

名称:抽象工厂模式

意图:提供一个创建一系列相关的或相互依赖对象的接口,而无需指定它们具体的类。

     适用环境:

     1、一个系统要独立它的产品的创建、组合和表示时

     2、一个系统要由多个产品系列中的一个来配置时。

     3、当你要强调一系列相关的产品对象的设计以便进行联合使用时。

     4、当你提供一个产品类库,而只想显示它们的接口而不是实现时。

 

    abstractclassAbstraactFactory

    {

        publicabstractAbstractProductACreateProductA();

        publicabstractAbstractProductBCreateProductB();

    }

    classConcreteFactory1: AbstraactFactory

    {

        publicoverrideAbstractProductACreateProductA()

        {

            returnnewProudctA1();

        }

        publicoverrideAbstractProductBCreateProductB()

        {

            returnnewProductB1();

        }

    }

    classConcreteFactory2: AbstraactFactory

    {

        publicoverrideAbstractProductACreateProductA()

        {

            returnnewProductA2();

        }

        publicoverrideAbstractProductBCreateProductB()

        {

            returnnewProductB2();

        }

    }

    abstractclassAbstractProductA

    {

    }

    abstractclassAbstractProductB

    {

        publicabstractvoidInteract(AbstractProductAa);

    }

    classProudctA1: AbstractProductA

    {

    }

    classProductB1: AbstractProductB

    {

        publicoverridevoidInteract(AbstractProductAa)

        {

            Console.WriteLine(this.GetType().Name +

                " interacts with "+ a.GetType().Name);

        }

    }

    classProductA2: AbstractProductA

    {

    }

    classProductB2: AbstractProductB

    {

        publicoverridevoidInteract(AbstractProductAa)

        {

            Console.WriteLine(this.GetType().Name +

                " interacts with "+ a.GetType().Name);

        }

    }

    classClient

    {

        privateAbstractProductA_abstractProductA;

        privateAbstractProductB_abstractProductB;

        publicClient(AbstraactFactoryfactory)

        {

            _abstractProductB = factory.CreateProductB();

            _abstractProductA = factory.CreateProductA();

        }

        publicvoidRun()

        {

            _abstractProductB.Interact(_abstractProductA);

        }

}

调用:

AbstraactFactoryfactory1 = newConcreteFactory1();

Clientclient1 = newClient(factory1);

client1.Run();

AbstraactFactoryfactory2 = newConcreteFactory2();

Clientclient2 = newClient(factory2);

client2.Run();

输出:

ProductB1 interacts with ProudctA1

ProductB2 interacts with ProductA2