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


 

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

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

為什么要有了工廠模式之后還要有抽象工廠模式?

因為更方便,更合理,更加低耦合,我舉個例子來說明一下。

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

水果工廠里面就夠了。

但是如果你程序里面有四個對象,蘋果汁,蘋果派,香蕉汁,香蕉派,這四個對象正好有明確的層級關系,可以抽象為兩個層級,蘋果,香蕉,或者果汁,派。這時候你怎么來創建這些對象呢?這時候工廠模式明顯已經不適用了,因為工廠模式是對象都實現了同一個接口,這時候就可以使用抽象工廠模式了。

具體怎么做呢?

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

然后再設計一個抽象的工廠(抽象類)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,勉強算是概念圖,有點丑。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM