您的位置:首页 > 编程语言 > Java开发

java设计模式--[创建模式]--抽象工厂[abstract factory]

2011-02-07 02:35 597 查看

 抽象工廠
     提供一個接口,用於創建相關或依賴對象的家族,而不需要指定具體類.

 

二. 設計某些系統是坷以南非要為用戶提供一系列相關的的對象,但系統不希望用戶真接使用new 運算符實例化這些對象,

而由系統來控制這些對象的創建,否則用戶不僅要清楚地知道使用哪些類創建這些對象,還要知道它們之間的關係,使得用戶

的代碼和這些類形成緊耦合,缺乏彈性,不利于維護.這時就可以使用抽象工廠模式來解決這些問題.

 

三. 抽象工廠的UML類圖如下:

四. 接前一章"工廠方法"的事例基礎上,增加了原料類,酒店必須從規定的原料工廠中採購原料; 完整示例代碼如下:

 

1. 抽象產品: 菜肴的制作流程

package creationalPattern.factory.abstracted;

/**
* 菜肴的制作流程[抽象產品]
* @author Liyongbin
* @date 2011-02-06
*/
public interface ICuisine {

//採購原料
public  String purchase();
//制作加工
public  String processing();
//成品銷售
public  String vendition();
}

    抽象產品:酒店採購原料工廠

package creationalPattern.factory.abstracted;

/**
* 原料工廠[抽象產品]
* @author Liyongbin
* @date 2011-02-06
*/
public interface IMaterial {
//素食原料
public  String maigre();
//荤食原料
public String meat();
//醬料原料
public String catsup();
}

 

2.抽象工廠: 酒店[總店]

package creationalPattern.factory.abstracted;

/**
* 香格裡拉酒店[總店]--抽象工廠[AbstractFactory]
* @author Liyongbin
* @date 2011-02-06
*/
public abstract class  ShangriLaHotel {

/**
* 採購原料的方法[工廠方法]
* @return
*/
public abstract IMaterial purchaseMaterial(String localMeterial);

/**
* 制作菜肴的方法[工廠方法]
* @param localCuisine生產的地方菜
* @return
*/
public abstract ICuisine cooking(String localCuisine);

/**
* 訂單方法
* @param localCuisine預訂的地方菜
*/
//使用總店的訂單系統
public void order(String localMeterial, String localCuisine) {

//訂購的菜系
ICuisine cuisine =cooking(localCuisine);
System.out.println(cuisine.purchase());
//採購原料
IMaterial material = purchaseMaterial(localMeterial);
System.out.println(material.maigre());
System.out.println(material.meat());
System.out.println(material.catsup());
System.out.println(cuisine.processing());
System.out.println(cuisine.vendition());
}
}

 

3. 地方名菜制作流程:湘菜

package creationalPattern.factory.abstracted;
/**
* 湘菜類
* @author Liyongbin
* @date 2011-02-06
*/
public class HunanCuisine implements ICuisine{

@Override
public String processing() {
return "湘菜烹調加工";
}

@Override
public String purchase() {
return "湘菜原料採購";
}

@Override
public String vendition() {
return "湘菜成品銷售";
}
}

   地方名菜制作流程:川菜

package creationalPattern.factory.abstracted;

/**
* 川菜類
* @author Liyongbin
* @date 2011-02-06
*/
public class SichuanCuisine implements ICuisine {

@Override
public String processing() {
return "川菜烹調加工";
}

@Override
public String purchase() {
return "川菜原料採購";
}

@Override
public String vendition() {
return "川菜成品銷售";
}
}

 

4.北京的原料工廠

package creationalPattern.factory.abstracted;

/**
* 北京的原料工廠
* @author Liyongbin
* @date 2011-02-06
*/
public class Material4BeiJing implements IMaterial {

@Override
public String catsup() {
return "從北京原料廠採購[醬料原料]";
}

@Override
public String maigre() {
return "從北京原料廠採購[素食原料]";
}

@Override
public String meat() {
return "從北京原料廠採購[葷食原料]";
}
}

    上海原料工廠

package creationalPattern.factory.abstracted;

/**
* 上海原料工廠
* @author Liyongbin
* @date 2011-02-06
*/
public class Material4ShangHai implements IMaterial {

@Override
public String catsup() {
return "從上海原料廠採購[醬料原料]";
}

@Override
public String maigre() {
return "從上海原料廠採購[素食原料]";
}

@Override
public String meat() {
return "從上海原料廠採購[葷食原料]";
}
}

 

5.北京分店

package creationalPattern.factory.abstracted;

/**
* 香格裡拉酒店[北京分店]
* @author Liyongbin
* @date 2011-02-06
*/
public class ShangriLaHotel4BeiJing extends ShangriLaHotel{

/**
* 採購本地原料
*/
public IMaterial purchaseMaterial(String localMeterial) {
IMaterial material =null;
if (localMeterial.equalsIgnoreCase("BeiJing")) {//北京原料
material=new Material4BeiJing();
} else if(localMeterial.equalsIgnoreCase("ShangHai")){//上海原料
material=new Material4ShangHai();
}
return material;
}

/**
* 制作有本地[北京]特色的地方[川,湘]名菜
* @param localCuisine預訂的地方名菜
*/
@Override
public ICuisine cooking(String localCuisine) {
System.out.println("香格裡拉大酒店[北京分店]");
ICuisine cuisine=null;
if (localCuisine.equalsIgnoreCase("Hunan")) {//湘菜
cuisine=new HunanCuisine();
} else if(localCuisine.equalsIgnoreCase("Sichuan")){//川菜
cuisine=new SichuanCuisine();
}
return cuisine;
}
}

   上海分店:

package creationalPattern.factory.abstracted;

/**
* 香格裡拉大酒店[上海分店]
* @author Liyongbin
* @date 2011-02-06
*/
public class ShangriLaHotel4ShangHai extends ShangriLaHotel{

/**
* 採購本地原料
*/
@Override
public IMaterial purchaseMaterial(String localMeterial) {
IMaterial material =null;
if (localMeterial.equalsIgnoreCase("BeiJing")) {//北京原料
material=new Material4BeiJing();
} else if(localMeterial.equalsIgnoreCase("ShangHai")){//上海原料
material=new Material4ShangHai();
}
return material;
}

/**
* 制作有本地[上海]特色的地方[川,湘]名菜
* @param localCuisine預訂的地方名菜
*/
@Override
public ICuisine cooking(String localCuisine) {
System.out.println("香格裡拉大酒店[上海分店]");
ICuisine cuisine=null;
if (localCuisine.equalsIgnoreCase("Hunan")) {//湘菜
cuisine=new HunanCuisine();
} else if(localCuisine.equalsIgnoreCase("Sichuan")){//川菜
cuisine=new SichuanCuisine();
}
return cuisine;
}
}

 

 6.網上訂購: 可以定各地方名菜,還可以指定使用的原料;

package creationalPattern.factory.abstracted;

/**
* 抽象工廠測試
* @author Liyongbin
* @date 2011-02-06
*/
public class AbstractFactoryTest {

public static void main(String[] args) {

//網上訂購川菜,用北京的原料
ShangriLaHotel slh4bj = new ShangriLaHotel4BeiJing();
slh4bj.order("BeiJing", "Sichuan");

System.out.println("===================");
//網上訂購湘菜,用上海的原料
ShangriLaHotel slh4sh = new ShangriLaHotel4ShangHai();
slh4sh.order("ShangHai", "Hunan");
}
}

 

7. 運行結果如下:

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: