为一个产品族提供统一的创建接口。当需要这个产品族的某一系列的时候,可从抽象工厂里选择相应的系列来创建一个具体的工厂。

 

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。《设计模式》

 

 

 

·抽象工厂(Abstract Factory)

用于声明生成一系列抽象产品的方法。即AbstractFactory,其中带有生成产品A和产品B的创建方法。

·具体工厂(Concrete Factory

用于执行生成一系列抽象产品的方法,生成一系列具体的产品。这里包括ConcreteProduct_1ConcreteProduct_2,其中每个实现工厂都带有两种产品的创建方法,不同的是:工厂1生产(创建)1系产品;工厂2生产(创建)2系产品。

·抽象产品(Abstract Product

用于为这一系列的某一种产品提供接口。这里有AbstractProductAAbstractProductB

·具体产品(Concrete Product

用于定义具体工厂生成的具体产品的对象,实现产品接口。这里有实现AbstractProductA接口的两个系的产品包括:ConcreteProductA_1ConcreteProductA_2,虽然这是两系的产品,但它们是一种产品!同样,AbstractProductB也包括两系产品。

 

现在来实现这个模式

(一) 代码

//抽象工厂

    //这个工厂可以生产(创建)两种产品AB

    public abstract class AbstractFactory

    {

        public abstract AbstractProdcutA CreateProductA();

        public abstract AbstractProdcutB CreateProductB();

    }

 

    //实现工厂1

    //用于生产(创建)1系列产品

    public class ConcreteFactoryProduct_1:AbstractFactory

    {

        //因为这是工厂1,所以只负责生产(创建)1系的产品,但产品种类是AB

 

        //生产A

        public override AbstractProdcutA CreateProductA()

        {

            return new ProductA_1();

        }

 

        //生产B

        public override AbstractProdcutB CreateProductB()

        {

            return new ProductB_1();

        }

    }

 

    //两种产品

    //产品A

    public abstract class AbstractProdcutA

    {

        public abstract void ShowDetail();

    }

    //产品B

    public abstract class AbstractProdcutB

    {

        public abstract void ShowDetail();

    }

 

    //1系产品,包括ProductA_1productB_1

    public class ProductA_1 : AbstractProdcutA

    {

        public override void ShowDetail()

        {

            Console.WriteLine("1A产品");

        }

    }

 

    public class ProductB_1 : AbstractProdcutB

    {

        public override void ShowDetail()

        {

            Console.WriteLine("1B产品");

        }

    }

(二)测试

[Test]

        public void TestAbstractFactory()

        {

            //得到一个1系产品工厂

            AbstractFactory factory = new ConcreteFactoryProduct_1();

 

            //所以只用于生产1系产品,但产品种类有多种,如A,B

 

            //这里添加2种产品

            AbstractProdcutA productA = factory.CreateProductA();

            AbstractProdcutB productB = factory.CreateProductB();

 

            //看看产品的信息吧

            productA.ShowDetail();

            productB.ShowDetail();

        }

 

结果:

1A产品

1B产品

 

在软件系统中,经常面临着"一系统相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作。绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合。

 posted on 2009-12-15 12:56  野人哥哥  阅读(247)  评论(0编辑  收藏  举报