设计模式之工厂方法(Factory Method)
在软件开发过程中,有很多人抱怨着需求的变化,是需求没有做好么?不是的,其实需求变化在软件开发中是不可避免的。做人也是一样,出了问题要先从自己这边找原因,然后想办法解决。我们身为程序员,向用户和需求分析师们抱怨(其实,任何一种抱怨都是没有意义的),是没有意义的。究竟怎样解决这个问题呢?我身边很多人都有这种苦恼,竟然没人去想,难道我身边的这群人都不懂设计模式?悲剧……
我始终坚信,在软件开发里:优秀的算法+优秀的设计模式+优秀的架构=Nothing impossible!(这句话是原创!)
以上是题外话,就此打住。这次的重点是工厂方法设计模式。
-------------------------------------------------------------------------------------------------
在软件系统中,由于需求的变化,"这个对象的具体实现"经常面临着剧烈的变化,但它却有比较稳定的接口。如何应对这种变化呢?提供一种封装机制来隔离出"这个易变对象"的变化,从而保持系统中"其它依赖的对象"不随需求的变化而变化。定义一个用户创建对象的接口或者定义好的抽象类,让子类决定实例哪一个类。Factory Method使一个类的实例化延迟到子类。
以C#为例,下面是工厂方法模式设计的工厂和产品类结构图:
其中的方法、属性可以根据需要自定义。编译生成FactoryMethod.dll。
static void Main(string[] args) { while (true) { ///模拟动态生成对象 //输入要实例化的工厂类型 Console.WriteLine("请输入工厂类型(区分大小写):FactoryOne FactoryTwo"); string factoryType = Console.ReadLine().ToString(); if (factoryType == "exit") return; //如果为输入,就采用默认配置的工厂类型 if (factoryType == "") { Console.WriteLine("采用配置文件的工厂类型"); factoryType = ConfigurationManager.AppSettings["Type"]; } Factory factory = (Factory)Assembly.Load("FactoryMethod").CreateInstance("FactoryMethod." + factoryType); ; //如果实例化成功,就输出产品信息 if (factory != null) { Product product = factory.CreateProduct(); Console.WriteLine(product.ProductDiscription()); } else { Console.WriteLine("没有这种工厂!"); } } }
上面的代码演示了,如何动态创建产品。
配置文件中配置的是
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="Type" value="FactoryOne"/> </appSettings> </configuration>
下面演示运行效果
这样有以下好处:
1.扩展性好,当需要扩展时,在代码中新建相应的工厂和产品类即可,前台代码无需更改。
2.当前台需要更换产品类型时,只需要更改配置文件即可,不用做任何其他的工作。
3.可重用,不解释。
4.封装性强,只要给一个名字,就能叫一个人来给你做出你想要的东西,很方便。