提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
適用性
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
工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。