java-pattern 之 读书笔记2 —— abstract factory

今天研究一下抽象工厂Abstract Factory)。

抽象工厂比简单工厂更复杂一些。它们的区别在于抽象的复杂度和层次不同。抽象工厂将工厂也抽象化了(用抽象类或接口实现),它指出工厂,而不指出它是制造什么产品的工厂,具体制造某个或某些产品的工厂由工厂的子类来完成,工厂的子类是一系列生产特定产品的工厂。抽象工厂模式的基本方法如下图示:
o_abstract factory.jpg
例如,我们向海尔公司下订单,要求生产电视机给我们,海尔公司有青岛海尔、南非海尔……,每个海尔分工厂都生产电视机和冰箱。
    /// <summary>
    
/// IProduct 产品接口。
    
/// </summary>

    public interface IProduct
    
{
        
string Type//型号
        {
            
get;
        }


        
string Price//价格
        {
            
get;
        }


        
string ProduceArea // 产地
        {
            
get;
        }

    }
    /// <summary>
    
/// ITvSet 电视机接口。
    
/// </summary>

    public interface ITvSet : IProduct
    
{
        
string Size//尺寸
        {
            
get;
        }

    }
    /// <summary>
    
/// IFridge 电冰箱接口。
    
/// </summary>

    public interface IFridge : IProduct
    
{
        
string Consume//耗能
        {
            
get;
        }

    }
    public class TvSet1 : ITvSet
    
{
        
public string Size //尺寸
        {
            
get return "29"; }
        }


        
public string Type //型号
        {
            
get return "T-PP"; }
        }


        
public string Price //价格
        {
            
get return "1800元"; }
        }


        
public string ProduceArea // 产地
        {
            
get return "青岛"; }
        }


    }
    public class TvSet2 : ITvSet
    
{
        
public string Size //尺寸
        {
            
get return "21"; }
        }


        
public string Type //型号
        {
            
get return "T-LL"; }
        }


        
public string Price //价格
        {
            
get return "1000元"; }
        }


        
public string ProduceArea // 产地
        {
            
get return "南非"; }
        }

    }
    public class Fridge1 : IFridge
    
{
        
public string Type //型号
        {
            
get return "R-32"; }
        }


        
public string Consume //耗能
        {
            
get return "1500w/h"; }
        }


        
public string Price //价格
        {
            
get return "10000元/台"; }
        }


        
public string ProduceArea // 产地
        {
            
get return "青岛"; }
        }

    }
    public class Fridge2 : IFridge
    
{
        
public string Type //型号
        {
            
get return "R-18"; }
        }


        
public string Consume //耗能
        {
            
get return "1000w/h"; }
        }


        
public string Price //价格
        {
            
get return "8000元/台"; }
        }


        
public string ProduceArea // 产地
        {
            
get return "南非"; }
        }

    }
    public interface ICreator
    
{
        ITvSet TvSetFactroy();
        IFridge FridgeFactory();
    }
    /// <summary>
    
/// QingdaoCreator 青岛厂。
    
/// </summary>

    public class QingdaoCreator : ICreator
    
{
        
public ITvSet TvSetFactroy()
        
{
            
return new TvSet1();
        }


        
public IFridge FridgeFactory()
        
{
            
return new Fridge1();
        }

    }
    /// <summary>
    
/// NanfeiCreator 南非厂。
    
/// </summary>

    public class NanfeiCreator : ICreator
    
{
        
public ITvSet TvSetFactroy()
        
{
            
return new TvSet2();
        }


        
public IFridge FridgeFactory()
        
{
            
return new Fridge2();
        }

    }

这样我如果要再添加一个美国厂,我只需要增加一个USACreator继承ICreator和相应的产品对象类就可以了,无须再对以前的代码做任何改动(如下所示)。扩展性比简单工厂模式好了很多。
    public class FridgeUSA : IFridge
    
{
        
public string Type //型号
        {
            
get return "fr_usa"; }
        }


        
public string Price //价格
        {
            
get return "1500$"; }
        }


        
public string Consume //耗能
        {
            
get return "1500w/h"; }
        }


        
public string ProduceArea // 产地
        {
            
get return "Made in USA"; }
        }

    }
    public class TvSetUSA : ITvSet
    
{
        
public string Type //型号
        {
            
get return "tv-usa"; }
        }


        
public string Price //价格
        {
            
get return "700$"; }
        }


        
public string Size //尺寸
        {
            
get return "29"; }
        }


        
public string ProduceArea // 产地
        {
            
get return "Made in USA"; }
        }

    }
    public class USACreator : ICreator
    
{
        
public ITvSet TvSetFactroy()
        
{
            
return new TvSetUSA();
        }


        
public IFridge FridgeFactory()
        
{
            
return new FridgeUSA();
        }

    }
posted on 2005-07-29 09:05  Michael J  阅读(403)  评论(0)    收藏  举报