创建型模式之工厂方法模式

常见问题

  

   客户程序要获取一个产品的实例,这个产品是变化的,但是这个产品抽象的接口是稳定的。当这个产品发生变化时,要求客户程序不变或者变化很小。我们该怎么实现呢?

分析问题

  要使产品发生变化时客户程序不变或者变化很小,就得使客户程序与产品之间建立松耦合,将客户程序对对象的依赖转移成对其他稳定对象的依赖。在客户程序与产品之间添加一个中间件,中间件来创建产品实例,客户程序直接使用中间件创建的实例。

解决方案

 方案一:在客户程序与产品之间添加一个实现类,这个类负责创建产品的实例,客户程序通过这个类来获取产品的实例。也就是简单工厂模式,由工厂类根据客户程序传入的参数动态决定创建哪件产品的实例。

    

简单工厂类一般做为工具使用,将简单工厂类的构造方法定义为私有的,简单工厂类的行为方法都定义为静态的。

简单工厂类和类中的行为方法的命名都是有讲究的,一般简单工厂类的命名为:“模块名称 + Factory ” ;行为方法的命名为:“Get + 接口名称”。

 产品

View Code
 public interface IProduct
    {
        string GetOperationName();
    }



    public class ProductA : IProduct
    {
        public string GetOperationName()
        {
            return "ProductA";
        }
    }

    public class ProductB : IProduct
    {
        public string GetOperationName()
        {
            return "ProductB";
        }
    }

 简单工厂类

View Code
 public class ProductFactory
    {
        public static IProduct GetProduct(int type)
        {
            IProduct product = null;
            if (type == 1)
            {
                product = new ProductA();
            }
            else if (type == 2)
            {
                product = new ProductB();
            }
            return product;
        }
    }

客户程序

View Code
class Program
    {
        static void Main(string[] args)
        {
            IProduct product = ProductFactory.GetProduct(1);
            string productName = product != null ? product.GetOperationName() : "空对象";
            Console.WriteLine(string.Format("客户程序想要获取 “{0}” 的实例", productName));
            Console.ReadKey();
        }
    }

 运行结果

 

 

方案二:工厂类和产品类依次对应。即一个抽象工厂类对应一个产品接口,一个具体工厂类对应一个具体产品类,这个具体的工厂就负责创建对应的具体产品的实例。

    系统在不修改工厂类的情况下就可以扩展新产品。比方案二更好的实现了开闭原则。

 

扩展

posted @ 2013-03-26 16:27  xwj_smile  阅读(175)  评论(0)    收藏  举报