在谈工厂方法模式之前要先提一下简单工厂模式。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑问题判断,根据客户端的选择条件动态实例化相关的类。
对客户端而言,去除了与具体产品的依赖。 但是!!!
由于有三大原则的关系,简单工厂模式并不是理想的模式,因为它违反了开放封闭原则(出自 学完模式判若两人之三大原则中)。
而工厂方法模式,定义了一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延续到其子类。这完全遵守了三大原则,更方便的扩展。
结构图对比:
 
根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的药生产具体类的工厂,就去实现这个接口即可。
而对于封闭开放原则,每次添加新的产品类和对应的工厂类时,不需要更改其他的类。不像简单工厂模式,每次的扩展都需要更改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();
}
}
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();
}
}
通过实例的对比,工厂方法模式比简单工厂模式更加规范,也在扩展方面具有更大的优势,符合三大原则。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂模式方法保持了简单工厂模式的优点,而且克服了它的缺点。
但是缺点是,工厂方法模式也增添了额外的开发量,因为没增添一个新的产品就要新增一个新的工厂。
同时,简单工厂模式也具有自己的简易性。
                    
                
                
            
        
浙公网安备 33010602011771号