java設計模式之創建型模式-抽象工廠(AbstractFactory)

提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

適用性

   1.一個系統要獨立於它的產品的創建、組合和表示時。

   2.一個系統要由多個產品系列中的一個來配置時。

   3.當你要強調一系列相關的產品對象的設計以便進行聯合使用時。

   4.當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。

參與者

   1.AbstractFactory

    聲明一個創建抽象產品對象的操作接口。

   2.ConcreteFactory

    實現創建具體產品對象的操作。

   3.AbstractProduct

    爲一類產品對象聲明一個接口。

   4.ConcreteProduct

    定義一個將被相應的具體工廠創建的產品對象。實現abstractProduct接口。

   5.Client

    僅使用由AbstractFactory和AbstractProduct類聲明的接口

類圖



例子

abstractFactory

package com.juluce.abstractFactory;

/**
 * <b>Application name:</b> IAnimalFactory.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public interface IAnimalFactory {
    ICat createCat();

    IDog createDog();
}
ConcreteFactory
package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> BlackAnimalFactory.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public class BlackAnimalFactory implements IAnimalFactory {

    /**
     * {方法功能中文描述}
     * 
     * @return
     * @author:江南漁翁
     */

    @Override
    public ICat createCat() {
	return new BlackCat();
    }

    /**
     * {方法功能中文描述}
     * 
     * @return
     * @author:江南漁翁
     */

    @Override
    public IDog createDog() {
	return new BlackDog();
    }

}

package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> WhiteAnimalFactory.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public class WhiteAnimalFactory implements IAnimalFactory {

    /**
     * {方法功能中文描述}
     * 
     * @return
     * @author:江南漁翁
     */

    @Override
    public ICat createCat() {
	return new WhiteCat();
    }

    /**
     * {方法功能中文描述}
     * 
     * @return
     * @author:江南漁翁
     */

    @Override
    public IDog createDog() {
	return new WhiteDog();
    }

}



AbstractProduct

package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> ICat.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public interface ICat {
    void eat();
}

package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> IDog.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public interface IDog {
    void eat();
}

Concreteproduct

package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> BlackCat.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public class BlackCat implements ICat {

    /**
     * {方法功能中文描述}
     * 
     * @author:江南漁翁
     */

    @Override
    public void eat() {
	System.out.println("The black cat is eating!");
    }
}

package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> BlackDog.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public class BlackDog implements IDog {

    /**
     * {方法功能中文描述}
     * 
     * @author:江南漁翁
     */

    @Override
    public void eat() {
	System.out.println("The black dog is eating");
    }
}

package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> WhiteCat.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public class WhiteCat implements ICat {

    /**
     * {方法功能中文描述}
     * 
     * @author:江南漁翁
     */

    @Override
    public void eat() {
	System.out.println("The white cat is eating!");
    }
}

package com.juluce.abstractFactory;

/** 
 * <b>Application name:</b> WhiteDog.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public class WhiteDog implements IDog {

    /**
     * {方法功能中文描述}
     * 
     * @author:江南漁翁
     */

    @Override
    public void eat() {
	System.out.println("The white dog is eating!");
    }
}

Test

package com.juluce.abstractFactory;

/**
 * <b>Application name:</b> Test.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public class Test {
    public static void main(String[] args) {
	IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
	ICat blackCat = blackAnimalFactory.createCat();
	blackCat.eat();
	IDog blackDog = blackAnimalFactory.createDog();
	blackDog.eat();

	IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
	ICat whiteCat = whiteAnimalFactory.createCat();
	whiteCat.eat();
	IDog whiteDog = whiteAnimalFactory.createDog();
	whiteDog.eat();
    }
}

result

The black cat is eating!

The black dog is eating!
The white cat is eating!
The white dog is eating!

形象比喻:

ABSTRACT FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生產雞翅的Factory

工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章