学习来源: 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个抽象产品.