设计模式之 简单工厂,工厂方法,抽象工厂

学习来源: C#设计模式,刘伟

创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展.

引言: 

简单工厂(静态工厂)

1, 模式适用环境

工厂类负责创建的对象比较少,由于创建的对象较少 ,不会造成工厂方法中的业务逻辑太过复杂

客户端只知道传入工厂类的参数,对于如何创建对象 并不关心

2, 简单工厂(静态工厂)方法的缺点:

工厂类集中了所有产品的创建逻辑,职责过重,一旦 不能正常工作,整个系统都要受到影响

增加系统中类的个数(引入了新的工厂类),增加了 系统的复杂度和理解难度

系统扩展困难,一旦添加新产品不得不修改工厂逻辑

由于使用了静态工厂方法,造成工厂角色无法形成基 于继承的等级结构,工厂类不能得到很好地扩展

3, 简单工厂方法的优点

实现了对象创建和使用的分离.  ==> 类的创建和使用分离,确保单一职责.

客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可

通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性 .

工厂方法设计模式.

ca435902-462d-4373-bf5e-6b6ae2b12456[11]

    针对简单工厂, 增加工厂方法接口.

    更进一步, 可以讲抽象工厂接口变更为抽象类.

/将接口改为抽象类
abstract class LoggerFactory 
{
    //在工厂类中直接调用日志记录器类的业务方法WriteLog()
    public void WriteLog() 
    {
        Logger logger = this.CreateLogger();
        logger.WriteLog(); //已经将具体工厂延迟到子类.
    }
    
    public abstract Logger CreateLogger();    
}
using System;
using System.Configuration;
using System.Reflection;
namespace FactoryMethodSample
{
    class Program
    {
        static void Main(string[] args)
        {
            LoggerFactory factory; //针对抽象工厂类编程
            Logger logger; //针对抽象产品类编程
            //读取配置文件
            string factoryString = ConfigurationManager.AppSettings["factory"];
            //反射生成对象
            factory = (LoggerFactory)Assembly.Load("FactoryMethodSample").CreateInstance(factoryString);
            logger = factory.CreateLogger();
            logger.WriteLog();
            Console.Read();
        }
    }
}
==> 更进一步之后的,省略了创建过程.
using System;
using System.Configuration;
using System.Reflection;
namespace FactoryMethodSample
{
    class Program
    {
        static void Main(string[] args)
        {
            LoggerFactory factory; //针对抽象工厂类编程
            //读取配置文件
            string factoryString = ConfigurationManager.AppSettings["factory"];
            //反射生成对象
            factory = (LoggerFactory)Assembly.Load("FactoryMethodSample").CreateInstance(factoryString);
            factory.WriteLog(); //直接使用工厂对象来调用产品对象的业务方法
            Console.Read();
        }
    }
}

  第三部分. 抽象工厂.

   对工厂方法的增强, 例如原本就一个产品. 现在是一组产品. 例如不同风格皮肤, 包括不同风格按钮.

   

    //使用抽象层定义
    SkinFactory factory;
    Button bt;
    TextField tf;
    ComboBox cb;
    
    //读取配置文件
    string factoryType = ConfigurationManager.AppSettings["factory"];
    
    //反射生成对象
    factory = (SkinFactory)Assembly.Load("AbstractFactorySample").CreateInstance(factoryType);
    
    bt = factory.CreateButton();
    tf = factory.CreateTextField();
    cb = factory.CreateComboBox();
    bt.Display();
    tf.Display();
    cb.Display();
    
     Console.Read();

f162e031-1532-4995-8928-489834e759ce[12]

2种产品线, 2个具体工厂. 2*3个具体产品. 3个抽象产品. 

posted @ 2015-06-09 17:32  hijushen  阅读(242)  评论(0编辑  收藏  举报