您的位置:首页 > 其它

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

2015-06-09 17:32 459 查看
学习来源: C#设计模式,刘伟 创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展. 引言: 简单工厂(静态工厂) 1, 模式适用环境 工厂类负责创建的对象比较少,由于创建的对象较少 ,不会造成工厂方法中的业务逻辑太过复杂 客户端只知道传入工厂类的参数,对于如何创建对象 并不关心 2, 简单工厂(静态工厂)方法的缺点: 工厂类集中了所有产品的创建逻辑,职责过重,一旦 不能正常工作,整个系统都要受到影响 增加系统中类的个数(引入了新的工厂类),增加了 系统的复杂度和理解难度 系统扩展困难,一旦添加新产品不得不修改工厂逻辑 由于使用了静态工厂方法,造成工厂角色无法形成基 于继承的等级结构,工厂类不能得到很好地扩展 3, 简单工厂方法的优点 实现了对象创建和使用的分离. ==> 类的创建和使用分离,确保单一职责. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性 . 工厂方法设计模式.

针对简单工厂, 增加工厂方法接口. 更进一步, 可以讲抽象工厂接口变更为抽象类.

/将接口改为抽象类
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();




2种产品线, 2个具体工厂. 2*3个具体产品. 3个抽象产品.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: