SQnote
永远有多远……
SQnote - java,web优化,python,(www.sqnote.cn)
 

2005-10-26――――――――――――――――――――――――――――――――――

抽象工厂(Abstract Factory

抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等

级结构;而抽象工厂模式则需要面对多个产品等级结构。

 

 

“开-闭”原则要求一个软件系统可以在不修改原有代码的情况下,通过扩展达到增强

其功能的目的。对于一个涉及到多个产品等级结构和多个产品族的系统,其功能的增强不

外乎两个方面:

1)增加新的产品族;

2)增加新的产品等级结构。

那么抽象工厂模式是怎样支持这两方面功能增强的呢?

增加新的产品族

在产品等级结构的数目不变的情况下,增加新的产品族,就意味着在每一个产品等级

结构中增加一个(或者多个)新的具体(或者抽象和具体)产品角色。

由于工厂等级结构是与产品等级结构平行的登记机构,因此,当产品等级结构有所调

整时,需要将工厂等级结构做相应的调整。现在产品等级结构中出现了新的元素,因此,

需要向工厂等级结构中加入相应的新元素就可以了。

换言之,设计师只需要向系统中加入新的具体工厂类就可以了,没有必要修改已有的

工厂角色或者产品角色。因此,在系统中的产品族增加时,抽象工厂模式是支持-

则的。

增加新的产品等级结构

在产品族的数目不变的情况下,增加新的产品等级结构。换言之,所有的产品等级结

构中的产品数目不会改变,但是现在多出一个与现有的产品等级结构平行的新的产品等级

结构。

要做到这一点,就需要修改所有的工厂角色,给每一个工厂类都增加一个新的工厂方

法,而这显然是违背“开闭”原则的。换言之,对于产品等级结构的增加,抽象工厂模式

是不支持“开闭”原则的。

综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加

提供方便,而不能为新的产品等级结构的增加提供这样的方便。

 

package cn.sqsoft.javapatterns.abstractfactory;

 

/**

 * @author 宝剑·123钢铁·123steel.cn
*  功能:抽象工厂

 */

public abstract class ComputerProducer

{

       public abstract Cpu createCpu();

 

       public abstract Ram createRam();

 

       public static ComputerProducer getInstance(String which)

       {

              if (which.equalsIgnoreCase("Pc"))

              {

                     return PcProducer.getInstance();

              }

              else if (which.equalsIgnoreCase("Mac"))

              {

                     return MacProducer.getInstance();

              }

              return null;

       }

}

 

package cn.sqsoft.javapatterns.abstractfactory;

 

/**

 * @author 宝剑·123钢铁·123steel.cn  
 *  功能:具体工厂1

 */

public class MacProducer extends ComputerProducer

{

       private static MacProducer producer = new MacProducer();

 

       private MacProducer()

       {

       }

 

       public Cpu createCpu()

       {

              return new MacCpu();

       }

 

       public Ram createRam()

       {

              return new MacRam();

       }

 

       public static MacProducer getInstance()

       {

              return producer;

       }

 

       /**

        * @link dependency

        * @label Creates

        */

       /* # MacRam lnkMacRam; */

 

       /**

        * @link dependency

        * @label Creates

        */

       /* # MacCpu lnkMacCpu; */

}

 

package cn.sqsoft.javapatterns.abstractfactory;

/**

 * @author 宝剑·123钢铁·123steel.cn 
 * 功能:具体工厂2

 */

public class PcProducer extends ComputerProducer

{

    private static PcProducer producer = new PcProducer();

 

    private PcProducer()

    {

    }

 

    public Cpu createCpu()

    {

        return new PcCpu();

    }

 

    public Ram createRam()

    {

        return new PcRam();

    }

 

    public static PcProducer getInstance()

    {

              return producer;

    }

 

    /** @link dependency

     * @label Creates*/

    /*# PcCpu lnkPcCpu; */

 

    /** @link dependency

     * @label Creates*/

    /*# PcRam lnkPcRam; */

}

 

package cn.sqsoft.javapatterns.abstractfactory;

/**

 * @author 宝剑·123钢铁·123steel.cn

 * 功能:抽象产品1

 */

public interface Cpu

{

}

 

package cn.sqsoft.javapatterns.abstractfactory;

/**

 * @author Administrator

 * 功能:抽象产品2

 */

public interface Ram

{

}

 

package cn.sqsoft.javapatterns.abstractfactory;

/**

 * @author 宝剑·123钢铁·123steel.cn 
 * 功能:具体产品

 */

public class MacCpu implements Cpu

{

}

 

package cn.sqsoft.javapatterns.abstractfactory;

/**

 * @author 宝剑·123钢铁·123steel.cn

 * 功能:具体产品

 */

public class PcCpu implements Cpu

{

}

 

package cn.sqsoft.javapatterns.abstractfactory;

/**

 * @author 宝剑·123钢铁·123steel.cn

 * 功能:具体产品

 */

public class MacRam implements Ram

{

}

 

package cn.sqsoft.javapatterns.abstractfactory;

/**

 * @author 宝剑·123钢铁·123steel.cn

 * 功能:具体产品

 */

public class PcRam implements Ram

{

}

posted on 2005-10-26 21:44  SQnote·www.SQnote.cn  阅读(397)  评论(1编辑  收藏  举报