创建型模式-抽象工厂模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 抽象工厂模式
{
    /*
     * 抽象工厂模式的意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
     * 抽象工厂模式的实现技巧:1、将抽象工厂建产品对象的创建延迟到它的具体工厂子类。
     *                         2、如果没有应对“多系列对象的”需求变化,则没有必要使用抽象工厂,这是使用简单的静态工厂就可以胜任了。
     *                         3、系列对象指的是这些对象之间相互依赖或相互作用的关系,例如游戏场景开发中道路与房屋的依赖,道路与地道的依赖
     *                         4、抽象工厂模式经常和工厂方法模式共同组合来应对“对象创建”的需求变化,即用工厂方法模式来创建单个产品,而用抽象工厂模式创建产品族
     *                         5、通常在运行时刻创建一个具体工厂的实例,这一具体工厂的创建具体有特定实现的产品对象,为创建不同的产品对象,客户应使用不同的具体工厂。
     *                         6、把工厂做为单件时,一个应用中一般每个产品系列只需要一个工厂实例,因此工厂通常最好实现一个单件模式。
     *                         7、创建产品,抽象工厂仅声明一个创建产品的接口,真正出创建产品的是由具体产品类创建的,
     *                            通常的办法是为每一个产品定义一个工厂方法,一个具体的工厂将为每个产品重定义该工厂方法以指定产品,
     *                            虽然这样的实现很简单,但它却要求每个产品系列都有一个具体的工厂子类,即使这些产品系列的差别很小。
     *                            
     * 抽象工厂模式的优点:1、分离了具体的类,抽象向工厂模式帮助你控制一个应用创建对象的类,因为工厂封装了创建产品对象的责任和过程,
     *                        它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,
     *                        他们不出现在客户代码中。
     *                     2、抽象工厂模式使得易于交换产品系列,一个具体的工程类在一个应用中仅出现一次,即在它初始化的时候,
     *                        这使得改变一个应用的具体的工厂变得容易,只需要改变具体工厂即可使用不同的产品配置,
     *                        因为一个抽象工厂创建了一个完整系列,属于整个产品系列会立刻改变。(即产品族的约束为非公开状态)
     *                     3、它有利于产品的一致性,当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,
     *                        因为这在实际应用中经常遇到,而抽象工厂则非常容易实现这点。
     *                        
     * 抽象工厂模式缺点:1、难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几口确定了可以被创建的产品集合,
     *                      支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。
     */

    /// <summary>
    /// 产品A的抽象
    /// </summary>
    public abstract class AbstractProductA
    {
        /// <summary>
        /// 产品A的抽象业务逻辑
        /// </summary>
        public abstract void BDoSomething();
    }
    /// <summary>
    /// 产品B的抽象
    /// </summary>
    public abstract class AbstractProductB
    {
        /// <summary>
        /// 产品B的抽象业务逻辑
        /// </summary>
        public abstract void BDoSomething();
    }

    /// <summary>
    /// A类具体产品A1
    /// </summary>
    public class ProductA1 : AbstractProductA
    {
        /// <summary>
        /// 具体产品A1的业务逻辑
        /// </summary>
        public override void BDoSomething()
        {
           //A1业务逻辑的实现
        }
    }
    /// <summary>
    /// A类具体产品A2
    /// </summary>
    public class ProductA2 : AbstractProductA
    {
        /// <summary>
        /// 产品A2的业务逻辑
        /// </summary>
        public override void BDoSomething()
        {
            //A2业务逻辑的实现
        }
    }
    /// <summary>
    /// B类的具体产品B1
    /// </summary>
    public class ProductB1 : AbstractProductB
    {
        public override void BDoSomething()
        {
           //B1产品的业务逻辑
        }
    }

    /// <summary>
    /// B类的具体产品B2
    /// </summary>
    public class ProductB2 : AbstractProductB
    {
        public override void BDoSomething()
        {
           //B2产品的业务逻辑
        }
    }

    /// <summary>
    /// 产品家族的具体创建抽象
    /// </summary>
    public abstract class AbstactFactory
    {
        /// <summary>
        /// 创建A类产品的抽象逻辑
        /// </summary>
        /// <returns></returns>
        public abstract AbstractProductA CreateProdcutA();
        /// <summary>
        /// 创建B类产品的抽象逻辑
        /// </summary>
        /// <returns></returns>
        public abstract AbstractProductB CreateProdcutB();
    }

    /// <summary>
    /// 创建第一族产品的具体工厂类
    /// </summary>
    public class ProdcutFactory1 : AbstactFactory
    {
        /// <summary>
        /// 创建产品A1的实现
        /// </summary>
        /// <returns></returns>
        public override ProductA1 CreateProdcutA()
        {
            return new ProductA1();
        }

        /// <summary>
        /// 创建产品B1的实现
        /// </summary>
        /// <returns></returns>
        public override ProductB1 CreateProdcutB()
        {
            return new ProductB1();
        }
    }

    /// <summary>
    /// 创建第二产品族的具体工厂
    /// </summary>
    public class ProdcutFactory2 : AbstactFactory
    {
        /// <summary>
        /// 创建产品A2的实现
        /// </summary>
        /// <returns></returns>
        public override ProductA2 CreateProdcutA()
        {
            return new ProductA2();
        }
        /// <summary>
        /// 创建产品B2的实现
        /// </summary>
        /// <returns></returns>
        public override ProductB2 CreateProdcutB()
        {
            return new ProductB2();
        }
    }

    /// <summary>
    /// 客户端调用类
    /// </summary>
    public class AppClient
    {
        public static void Main(string []args)
        {
            AbstactFactory factroy1=new ProdcutFactory1();
            AbstractProductA a1 = factroy1.CreateProdcutA();
            AbstractProductB b1 = factroy1.CreateProdcutB();
            a1.BDoSomething();//调用A1的方法
            b1.BDoSomething();//调用B的方法

            AbstactFactory factory2 = new ProdcutFactory2();
            AbstractProductA a2 = factory2.CreateProdcutA();
            AbstractProductB b2 = factory2.CreateProdcutB();
            a2.BDoSomething(); //调用A2的方法
            b2.BDoSomething(); //调用B2的方法

           

        }
    }

}
posted @ 2011-03-04 22:57  日月之明  阅读(400)  评论(0编辑  收藏  举报