我理解的設計模式-------抽象工廠模式

 

接着上一次工廠模式來講說抽象工廠模式。app

首先抽象工廠模式和工廠模式同樣是屬於建立型模式,也就是說它的目的也是用來建立對象的,其實我以爲說用來管理對象的建立更爲恰當一些。ide

爲何要有了工廠模式以後還要有抽象工廠模式?ui

由於更方便,更合理,更加低耦合,我舉個例子來講明一下。spa

假設目前你的程序裏面有兩個對象,蘋果(apple)和香蕉(banana),那麼你使用工廠模式就已經足夠了,由於她們屬於同一個品類,都屬於水果,若是在添加一個菠蘿產品,也只須要把菠蘿加入到你的設計

水果工廠裏面就夠了。code

可是若是你程序裏面有四個對象,蘋果汁,蘋果派,香蕉汁,香蕉派,這四個對象正好有明確的層級關係,能夠抽象爲兩個層級,蘋果,香蕉,或者果汁,派。這時候你怎麼來建立這些對象呢?這時候工廠模式明顯已經不適用了,由於工廠模式是對象都實現了同一個接口,這時候就可使用抽象工廠模式了。對象

具體怎麼作呢?blog

就是把對象抽象一下,把這四個對象抽象爲兩個接口,一個果汁接口,一個派的接口。繼承

而後再設計一個抽象的工廠(抽象類)abstractFactory,裏面生產抽象的對象(也就是接口)Juice,Pie,單看這個結構就是一個工廠模式,可是咱們要用生產的是對象而不是接口。接口

因此咱們還須要兩個具體工廠:

一個AppleFactory繼承abstractFactory,實現生成Pie的方法和生成Juice的方法,實際上就是生成對象AppleJuice和ApplePie,

一個BananaFactory繼承abstractFactory,實現生成Pie的方法和生成Juice的方法,實際上就是生成對象BananaJuice和BananaPie,

這樣的話,對於調用者來講,我在開發過程當中,只須要知道我操做的對象是Pie或者是Juice就夠了,這樣下降了耦合。

下面看下代碼,首先是調用點。

package abstractFactory;

/**
 * Created by songjian on 3/30/2016.
 */
public class Test {
    public  static void main(String args[]){
        AbstractFactory factory1 = new AppleFactory();
        factory1.createJuice().desc();
        factory1.createPie().desc(); //假設咱們以前須要的是applePie和appleJuice對象,如今須要換成bananaPie和BananaJuice對象
        //咱們只須要替換對應的實現工廠(把new AppleFactory換成new BananFactory就能夠了,耦合比較低)
        AbstractFactory factory2 = new BananaFactory();
        factory2.createJuice().desc();
        factory2.createPie().desc();
 
    }
}

 下面是抽象工廠,生產對象的抽象。

package abstractFactory;

/**
 * Created by songjian on 3/29/2016.
 */
public abstract class AbstractFactory {
    abstract Juice createJuice();
    abstract Pie createPie();
}

下面是具體工廠兩個

package abstractFactory;

/**
 * Created by songjian on 3/29/2016.
 */
public class AppleFactory extends AbstractFactory{

    @Override
    Juice createJuice() {
        return new AppleJuice();
    }

    @Override
    Pie createPie() {
        return new ApplePie();
    }
}
package abstractFactory;

/**
 * Created by songjian on 3/29/2016.
 */
public class BananaFactory extends  AbstractFactory{
    @Override
    Juice createJuice() {
        return new BananaJuice();
    }

    @Override
    Pie createPie() {
        return new BananaPie();
    }
}

下面是對象抽象出來的接口兩個

package abstractFactory;

/**
 * Created by songjian on 3/29/2016.
 */
public interface Juice {
    public void desc();
}
package abstractFactory;

/**
 * Created by songjian on 3/29/2016.
 */
public interface  Pie {
    public void desc();
}

最後是咱們要生產的四個對象。

package abstractFactory;

/**
 * Created by ken on 1/29/2016.
 */
public class AppleJuice implements Juice {

    @Override
    public void desc() {
        System.out.println("蘋果汁.");
    }
}
package abstractFactory;

/**
 * Created by ken on 1/29/2016.
 */
public class ApplePie implements Pie {
    @Override
    public void desc() {
        System.out.println("蘋果派");
    }
}
package abstractFactory;

/**
 * Created by ken on 1/29/2016.
 */
public class BananaJuice implements Juice {
    @Override
    public void desc() {
        System.out.println("香蕉汁.");
    }
}
package abstractFactory;

/**
 * Created by ken on 1/29/2016.
 */
public class BananaPie implements Pie {
    @Override
    public void desc() {
        System.out.println("香蕉派");
    }
}

而後最後,再配上一張,我以爲能夠幫助理解的圖,沒有用UML,勉強算是概念圖,有點醜。。。

相關文章
相關標籤/搜索