导航

学完模式判若两人——工厂方法模式

Posted on 2010-04-20 09:31  敬云  阅读(357)  评论(1)    收藏  举报

在谈工厂方法模式之前要先提一下简单工厂模式。

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑问题判断,根据客户端的选择条件动态实例化相关的类。

对客户端而言,去除了与具体产品的依赖。 但是!!!

由于有三大原则的关系,简单工厂模式并不是理想的模式,因为它违反了开放封闭原则(出自 学完模式判若两人之三大原则中)。

工厂方法模式,定义了一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延续到其子类。这完全遵守了三大原则,更方便的扩展。

 

结构图对比:

 

 

根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的药生产具体类的工厂,就去实现这个接口即可。

而对于封闭开放原则,每次添加新的产品类和对应的工厂类时,不需要更改其他的类。不像简单工厂模式,每次的扩展都需要更改Factory去适应这个新的产品类。

 

下面用代码演示他们的区别:

 

 

代码
//产品类及子类
    abstract class Product
    {
        
public abstract string ShowProduct();
    }
    
class ProductA : Product
    {
        
public override string ShowProduct()
        {
            
return "This is ProductA";
        }
    }
    
class ProductB : Product
    {
        
public override string ShowProduct()
        {
            
return "This is ProductB";
        }
    }
//简单工厂类
     class SampleFactory
    {
        
public static Product CreateProduct(string productName)
        {
            Product product 
= null;

            
switch (productName)
            {
                
case "productA":
                    product 
= new ProductA(); break;
                
case "productB":
                    product 
= new ProductB(); break;
                    
//若添加其他的产品,需要在这里添加新的case
            }

            
return product;
        }
//工厂方法类
     interface IFactory
    {
        Product CreateProduct();
    }
    
class FactoryA : IFactory
    {
        
public Product CreateProduct()
        {
            
return new ProductA();
        }
    }
    
class FactoryB : IFactory
    {
        
public Product CreateProduct()
        {
            
return new ProductB();
        }
    }
    
//若添加新的产品,添加新的类即可

//控制台代码
     class Program
    {
        
static void Main(string[] args)
        {
           
//以生产三个产品B为例
            
//简单工厂模式
            Product sproduct1 = SampleFactory.CreateProduct("productB");
            Console.WriteLine(
"sproduct1 :" + sproduct1.ShowProduct());
           
//每次都需要重新通过订单定制产品
            Product sproduct2 = SampleFactory.CreateProduct("productB");
            Console.WriteLine(
"sproduct2 :" + sproduct2.ShowProduct());
            Product sproduct3 
= SampleFactory.CreateProduct("productB");
            Console.WriteLine(
"sproduct3 :" + sproduct3.ShowProduct());

            
//工厂方法模式
            IFactory factory = new FactoryB();
            
//一次订单,批量生产
            Product product1 = factory.CreateProduct();
            Console.WriteLine(
"product1 :" + product1.ShowProduct());
            Product product2 
= factory.CreateProduct();
            Console.WriteLine(
"product1 :" + product2.ShowProduct());
            Product product3 
= factory.CreateProduct();
            Console.WriteLine(
"product1 :" + product3.ShowProduct());

            Console.ReadKey();
        }
    }

 

 

通过实例的对比,工厂方法模式比简单工厂模式更加规范,也在扩展方面具有更大的优势,符合三大原则。

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂模式方法保持了简单工厂模式的优点,而且克服了它的缺点。

但是缺点是,工厂方法模式也增添了额外的开发量,因为没增添一个新的产品就要新增一个新的工厂。

同时,简单工厂模式也具有自己的简易性。