java-pattern 之 读书笔记2 —— abstract factory
今天研究一下抽象工厂(Abstract Factory)。
抽象工厂比简单工厂更复杂一些。它们的区别在于抽象的复杂度和层次不同。抽象工厂将工厂也抽象化了(用抽象类或接口实现),它指出工厂,而不指出它是制造什么产品的工厂,具体制造某个或某些产品的工厂由工厂的子类来完成,工厂的子类是一系列生产特定产品的工厂。抽象工厂模式的基本方法如下图示:

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

例如,我们向海尔公司下订单,要求生产电视机给我们,海尔公司有青岛海尔、南非海尔……,每个海尔分工厂都生产电视机和冰箱。
/// <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();
}
}



浙公网安备 33010602011771号