【原创】一个例子比较简单工厂,工厂方法和抽象工厂方法

2016-10-30  本文已影响0人  nanteschen

设计模式的关键:封装变化(未来可能的变化)

简单工厂:封装的是创建对象的过程。

简单工厂实现:

例子一:阿迪达斯工厂

 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( );

这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂,当我们要增加“阿迪达斯帽子”这种功能时,不需要再改变原有的工厂类了,只需要再增加此功能的运动服装类和相应的工厂类就可以

简单工厂方法相比工厂方法违背了开放—封闭原则,不利于改动

抽象工厂:

抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

这里阿迪达斯公司现在生产皇马和拜仁两个不同球队的球衣,它的所有产品:球服,球袜和球鞋有皇马和拜仁两个不同的实现类型

简单工厂:用来生产同一等级结构中的任意产品。(对于增加新的产品,必须修改代码)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,必须修改代码;支持增加产品族,如水果族,蔬菜族)

抽象工厂和工厂方法是针对简单工厂对不同方向的扩展

抽象工厂关键在于产品之间的抽象关系,所以至少要两个产品;

工厂方法在于生成产品,不关注产品间的关系,所以可以只生成一个产品。

上一篇 下一篇

猜你喜欢

热点阅读