抽象工厂模式(Abstract)

总述
抽象工厂模式是所有工厂模式中最为抽象和最具有一般性的一种形态。
抽象工厂可以向客户提供一个接口,使得客户可以在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象,强调的是“系列对象“的变化。
在软件系统中,经常面临“一系列相互依赖的对象“的创建工作;相比 较工厂模式强调的是”单个对象“的变化,抽象工厂强调的是”系列对象“的变化。
同时由于需求的变化,往往存在着更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制“来避免客户程序和这种”多系列具体对象创建工作“的紧耦合?这就是我们要说的抽象工厂模式。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

类图

我们知道office和msn根据操作系统的不同可以分为windows版本的和mac版本的,也许还有linux,unix版本的,归根结底,这里的产品涉及到产品系列的问题,抽象工厂可以解决这个问题:

实例代码:

using System;  
  
//ms的产品:office  
public class Office  
{  
    private string softwareName;  
  
    public string SoftwareName  
    {  
        get { return softwareName; }  
        set { softwareName = value; }  
    }  
}  
  
public interface IOffice  
{  
    Office GetOffice();  
}  
  
//ms的windows版本Office  
public class WinOffice : IOffice  
{  
    public Office GetOffice()  
    {  
        return new Office();  
    }  
}  
  
//ms的macintosh版本Office  
public class MacOffice : IOffice  
{  
    public Office GetOffice()  
    {  
        return new Office();  
    }  
}  
  
//ms的产品:msn  
public class Msn   
{  
    private string softwareName;  
  
    public string SoftwareName  
    {  
        get { return softwareName; }  
        set { softwareName = value; }  
    }  
}  
  
public  interface IMsn  
{  
    Msn GetMsn();  
}  
  
//ms的windows版本msn  
public class WinMsn:IMsn  
{  
    public Msn GetMsn()  
    {  
        return new Msn();  
    }  
}  
  
//ms的macintosh版本msn  
public class MacMsn : IMsn  
{  
    public Msn GetMsn()  
    {  
        return new Msn();  
    }  
}  
  
interface ISoftwareFactory  
{  
    IOffice CreateOffice();  
    IMsn CreateMsn();  
}  
  
/// <summary>  
/// windows版本的工厂  
/// </summary>  
public class WindowsFactory:ISoftwareFactory  
{  
    public IOffice CreateOffice()  
    {  
        return new WinOffice();  
    }  
    public IMsn CreateMsn()  
    {  
        return new WinMsn();  
    }  
}  
  
/// <summary>  
/// macintosh版本的工厂  
/// </summary>  
public class MacFactory : ISoftwareFactory  
{  
    public IOffice CreateOffice()  
    {  
        return new MacOffice();  
    }  
    public IMsn CreateMsn()  
    {  
        return new MacMsn();  
    }  
}  
  
/// <summary>  
/// 客户端调用  
/// </summary>  
public class Client {  
    static void Main(string[] args)  
    {  
        ISoftwareFactory factory = new WindowsFactory();  
        IOffice office = factory.CreateOffice();  
        IMsn msn = factory.CreateMsn();  
    }  
}  

 工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类只能创建一个具体产品类的实例。 
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类可以创建多个具体产品类的实例。 

posted @ 2014-07-09 03:09  欢呼雀跃  阅读(189)  评论(0)    收藏  举报