您的位置:首页 > 其它

设计模式学习(四)抽象工厂

2013-04-23 15:12 483 查看
考虑这样的情况:食堂窗口1卖馒头与白菜,食堂窗口2卖包子与豆腐。包子与馒头属于面食,白菜与豆腐属于蔬菜类(姑且这么说吧)。怎样去封装这些内部信息才合适呢?

抽象工厂的原理图如下



面食类:

//*******************Pasta.java************************

public interface Pasta {

void showPrice();

}


具体面食:包子馒头类:

//******************Mantou.java***********************

public class Mantou implements Pasta {

public void ShowPrice() {

System.out.println("The Mantou is 0.5 yuan.");

}

}

//****************Baozi.java****************************

public class Baozi implements Product {

public void showPrice() {
System.out.println("The Baozi is 0.8 yuan.");
}

}


蔬菜类:

//***************Vegetable.java*************************

public interface Vegetable {

void showNutrition();

}


具体蔬菜:白菜豆腐类

//*****************Baicai.java**************************

public class Baicai implements Vegetable {

public void showNutrition() {

System.out.println("baicai has more nutrition than tofu.");

}

}

//*********************Tofu.java****************************

public class Tofu implements Vegetable {

public void showNutrition() {

System.out.println("tofu has less nutrition than baicai.");

}

}


抽象工厂类:

//*******************FactoryMethod.java*********************

public class FactoryMethod {

abstract Pasta factoryMethodPrice();
abstract Vegetable factoryMethodNutrition();

void sayTxt() {

Pasta pasta = factoryMethodPasta();
Vegetable vegetble = factoryMethodVegetable();
System.out.println(pasta.showPrice()+"-------"vegetable.showNutrition());

}

}


窗口一:生产馒头与白菜:

//****************Factory1.java**************************

public class Factory1 extends FactoryMethod {

public Pasta factoryMethodPrice() {

return new Mantou();

}

public Vegetable factoryMethodNutrition() {

return new Baicai();

}

}


窗口2:生产包子与豆腐:

//*********************Factory2.java***************************

public class Factory2 extends FactoryMethod {

public Pasta factoryMethodPrice() {

return new Baozi();

}

public Vegetable factoryMethodNutrition() {

return new Tofu();

}

}


客户端调用:

//******************Client.java****************************

public class Client {

public static void main(String []args) {

FactoryMethod factoryMethod = new Factory1();
factoryMethod.sayTxt();
factoryMethod = new Factory2();
factoryMethod.sayTxt();

}

}


工厂方法与抽象工厂的区别就在于:工厂方法针对相似的产品对其进行封装,抽象工厂是几类产品,对其封装。好比家具的制作,有的工厂只负责生产木材,有的工厂只负责生产钉子,有的工厂只负责生产木门,有的工厂只负责进行家具组装,而且不同品牌的家具会有不同的制造工厂。

好吧,我也被绕晕了

PS:简单工厂由client端实现所要做的工作(包子馒头这个例子好像没有体现出来)。

工厂方法是直接在工厂中实现所要做的工作,Client端只用调用该方法。(如果在工厂方法中的工厂类添加一个sayTxt方法,简单工厂无此方法,需要在Client中进行实现)。

抽象工厂是几类产品的不同方法(showPrice与showNutrition)的封装。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: