设计模式的关键:封装变化(未来可能的变化)
简单工厂:封装的是创建对象的过程。
简单工厂实现:
例子一:阿迪达斯工厂
class AdidasFactory {
public static Sportswear createSportswear(string sportswear) {
Sportswear wear= null;
switch (sportswear) {
case “footballSuit”:
wear= newSportswear_footballSuit();
break;
case “footballShoes”:
wear= newSportswear_footballShoes();
break;
case “stockings”:
wear= newSportswear_stockings();
break;
}
returnwear;
}
}
客户端:
Sportswear wear = AdidasFactory.createSportswear(”footballSuit”);
MyFootballSuit footballSuit = wear.GetSportswear( );
这时如果阿迪达斯工厂要新增一个生产“帽子”的方法类,他就必须修改原有的AdidasFactory工厂类,新增一个“case”不但对扩展开放了,对修改也开放了,违背了开放-封闭原则。
工厂方法:封装的内容是“类的扩展”,方便增加新的产品/功能,使类的实例化延迟到子类
例子二:阿迪达斯工厂
先建一个工厂接口:
interface AdidasFactory {
Sportswear CreateSportswear();
}
然后球服球鞋球袜各建一个具体工厂实现接口:
class FootballSuitFactory: AdidasFactory{
public Sportswear CreateSportswear( ) {
return new FootballSuit( );
}
}
class FootballShoesFactory: AdidasFactory{
public Sportswear CreateSportswear( ) {
return new FootballShoes( );
}
}
class StockingsFactory: AdidasFactory{
public Sportswear CreateSportswear( ) {
return new Stockings( );
}
}
客户端的实现是这样的:
AdidasFactory adidasFootballSuitFactory= new FootballSuitFactory( );
Sportswear wear = adidasFootballSuitFactory.CreateSportswear( );
MyFootballSuit footballSuit=wear.GetSportswear( );
这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂,当我们要增加“阿迪达斯帽子”这种功能时,不需要再改变原有的工厂类了,只需要再增加此功能的运动服装类和相应的工厂类就可以
简单工厂方法相比工厂方法违背了开放—封闭原则,不利于改动
抽象工厂:
抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
这里阿迪达斯公司现在生产皇马和拜仁两个不同球队的球衣,它的所有产品:球服,球袜和球鞋有皇马和拜仁两个不同的实现类型
简单工厂:用来生产同一等级结构中的任意产品。(对于增加新的产品,必须修改代码)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,必须修改代码;支持增加产品族,如水果族,蔬菜族)
抽象工厂和工厂方法是针对简单工厂对不同方向的扩展
抽象工厂关键在于产品之间的抽象关系,所以至少要两个产品;
工厂方法在于生成产品,不关注产品间的关系,所以可以只生成一个产品。
网友评论