设计模式之 简单工厂,工厂方法,抽象工厂
2015-06-09 17:32
459 查看
学习来源: C#设计模式,刘伟 创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展. 引言: 简单工厂(静态工厂) 1, 模式适用环境 工厂类负责创建的对象比较少,由于创建的对象较少 ,不会造成工厂方法中的业务逻辑太过复杂 客户端只知道传入工厂类的参数,对于如何创建对象 并不关心 2, 简单工厂(静态工厂)方法的缺点: 工厂类集中了所有产品的创建逻辑,职责过重,一旦 不能正常工作,整个系统都要受到影响 增加系统中类的个数(引入了新的工厂类),增加了 系统的复杂度和理解难度 系统扩展困难,一旦添加新产品不得不修改工厂逻辑 由于使用了静态工厂方法,造成工厂角色无法形成基 于继承的等级结构,工厂类不能得到很好地扩展 3, 简单工厂方法的优点 实现了对象创建和使用的分离. ==> 类的创建和使用分离,确保单一职责. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性 . 工厂方法设计模式.
针对简单工厂, 增加工厂方法接口. 更进一步, 可以讲抽象工厂接口变更为抽象类.
第三部分. 抽象工厂.
对工厂方法的增强, 例如原本就一个产品. 现在是一组产品. 例如不同风格皮肤, 包括不同风格按钮.
2种产品线, 2个具体工厂. 2*3个具体产品. 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个抽象产品.
相关文章推荐
- JMS样本
- Java最佳实战
- 7.5
- static函数与普通函数
- Core Animation 学习
- 我理解的优秀软件工程师
- ACM学习历程—HDU5265 pog loves szh II(策略 && 贪心 && 排序)
- android:ViewPager与FragmentPagerAdapter
- WES 7 FBWF灾难性故障
- 分治法求最大子数组备忘
- 认识自己——我需要的
- [学习记录]NSMutableDictionary如何插入Int类型数据
- @DiscriminatorColumn用法
- 第五章
- mac 下docker得端口转发
- Asp.net mvc5开源项目"超级冷笑话"
- Myeclipse常用快捷键
- Maven实战——使用Nexus创建私服(上)
- Valid Parentheses
- Android开发教程--第一个JNI程序