设计模式之抽象工厂(Abstract Factory)

  抽象工厂模式:一个系列、一个类别、一个平台等引申来的某种相同架构,并且这个架构比较稳定,在此架构上求灵活扩展变化。并且在不同的架构上,产出的的东西有着本质的不同。专业一点来说,这个架构里有一个“产品族”的概念,什么是产品族?

  产品族

  是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。显然,每一个产品族中含有产品的数目,与产品等级结构的数目是相等的,形成一个二维的坐标系,水平坐标是产品等级结构,纵坐标是产品族。叫做相图。当有多个不同的等级结构的产品时,如果使用工厂方法模式就势必要使用多个独立的工厂等级结构来对付这三个产品的等级结构。如果这些产品等级结构是平行的,会导致多个平行的工厂等级结构。 抽象工厂模式使用同一个工厂等级结构负责三个不同产品等级结构产品对象的创建。对于每一个产品族,都有一个具体工厂。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。通过引进抽象工厂模式,可以处理具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题。由于每个具体工厂角色都需要负责两个不同等级结构的产品对象的创建,因此每个工厂角色都需要提供两个工厂方法,分别用于创建两个等级结构的产品。既然每个具体工厂角色都需要实现这两个工厂方法,所以具有一般性,不妨抽象出来,移动到抽象工厂角色中加以声明。(这是百度上的,晦涩的啦啦了半天,其实重点就是让我们把架构给抽象出来。)

  没有固定架构用抽象产品没什么用,还啰嗦,既然我们要用抽象工厂模式就肯定有架构。既然架构出来了,那么我们就打个比方,我们是上帝,要造一种生物,错了,是一系列的生物,这一系列的生物的架构差不多,就是骨架都差不多。比如我要造人和猫,骨架是一个头、一个躯干和四肢。这样我们就可以把这个骨架给抽象出来了。

  

上帝的工厂
     //上帝造生物的工厂
     public abstract class Factory
    {
        public abstract Head CreatHead();
        public abstract Body CreatBody();
        public abstract Limbs CreatLimbs();
    }
    //
    public abstract class Head
    {
        public abstract void AssembleHead();
    }
    //躯干
     public abstract class Body
    {
        public abstract void AssembleBody();
    }
    //四肢
    public abstract class Limbs
    {
        public abstract void AssembleLimbs();
    }

  然后就是实现了,具体怎么实现,代码就不写了,无非就是继承抽象啊,实现方法啊,就好像骨架出来了,往上面堆肉,表面插点毛啊什么的。

  最后出来两个工厂:CatFacotry、HumanFactory。

  这就是我们要的东西。工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构。我们可以结合工厂方法模式来造一个生产工厂的工厂,将Cat和Human作为两个参数,这样暴露出来的就只有抽象类Facotry了。

  至于扩展、维护、更新就一目了然了。

posted @ 2012-06-20 15:41  Jim_技迷  阅读(163)  评论(0编辑  收藏  举报