设计模式之工厂方法(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.封装性强,只要给一个名字,就能叫一个人来给你做出你想要的东西,很方便。

posted @ 2012-06-13 16:13  Jim_技迷  阅读(192)  评论(0编辑  收藏  举报