抽象工廠模式:
此模式提供了一個接口,用于建立相關或者依賴對象的家族,而不需要指定具體實作類.
解決什麼問題:
抽象工廠模式允許客戶在使用抽象接口來建立一組相關的産品,客戶類和工廠類分開,客戶需要任何産品的時候,隻需要向工廠請求即可,客戶無須修改就可以獲得新産品.進而實作客戶從具體的産品中解耦.
UML:

代碼結構:
代碼:
定義抽象産品:
package com.demo.factory.model;
/**
* 抽象産品
*/
public abstract class AbstractBaseFood {
protected String kind;
protected int num;
protected float price;
public float totalPrice() {
return this.num * this.price;
}
}
産品接口:
package com.demo.factory.model;
/**
* 抽象産品接口
*/
public interface IFood {
void printMessage();
}
抽象具體産品-Beverage類:
package com.demo.factory.model;
/**
* 抽象具體産品-Beverage
*/
public abstract class Beverage extends AbstractBaseFood implements IFood{
@Override
public void printMessage() {
System.out.println("--" + this.kind + "飲料, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
}
}
抽象具體産品-ChickenWings類:
package com.demo.factory.model;
/**
* 抽象具體産品-ChickenWings
*/
public abstract class ChickenWings extends AbstractBaseFood implements IFood {
@Override
public void printMessage() {
System.out.println("--" + this.kind + "風味雞翅, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
}
}
抽象具體産品-FrenchFries類:
package com.demo.factory.model;
/**
* 抽象具體産品-FrenchFries
*/
public abstract class FrenchFries extends AbstractBaseFood implements IFood {
@Override
public void printMessage() {
System.out.println("--" + this.kind + "風味薯條, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
}
}
抽象具體産品-Hamburg類:
package com.demo.factory.model;
/**
* 抽象具體産品-Hamburg
*/
public abstract class Hamburg extends AbstractBaseFood implements IFood {
@Override
public void printMessage() {
System.out.println("--" + this.kind + "風味漢堡, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
}
}
具體産品-ChinaBeverage類:
package com.demo.factory.model.kfc;
import com.demo.factory.model.Beverage;
/**
* 具體産品-ChinaBeverage
*/
public class ChinaBeverage extends Beverage {
public ChinaBeverage(int num) {
this.kind = "可樂";
this.price = 8.0f;
this.num = num;
}
}
具體産品-ChinaChickenWings類:
package com.demo.factory.model.kfc;
import com.demo.factory.model.ChickenWings;
/**
* 具體産品-ChinaChickenWings
*/
public class ChinaChickenWings extends ChickenWings {
public ChinaChickenWings(int num) {
this.kind = "奧爾良";
this.price = 2.5f;
this.num = num;
}
}
具體産品-ChinaFrenchFries類:
package com.demo.factory.model.kfc;
import com.demo.factory.model.FrenchFries;
/**
* 具體産品-ChinaFrenchFries
*/
public class ChinaFrenchFries extends FrenchFries {
public ChinaFrenchFries(int num) {
this.kind = "普通";
this.price = 8.0f;
this.num = num;
}
}
具體産品-ChinaHamburg類:
package com.demo.factory.model.kfc;
import com.demo.factory.model.Hamburg;
/**
* 具體産品-ChinaHumburg
*/
public class ChinaHamburg extends Hamburg {
public ChinaHamburg(int num) {
this.kind = "麻辣";
this.price = 14.0f;
this.num = num;
}
}
抽象工廠接口:
package com.demo.factory.itf;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
/**
* 抽象工廠接口
*/
public interface IKfcFactory {
Hamburg createHamburg(int num);
ChickenWings createChickenWings(int num);
FrenchFries createFrenchFries(int num);
Beverage createBeverage(int num);
}
實際工廠:
package com.demo.factory.itf;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
import com.demo.factory.model.kfc.ChinaBeverage;
import com.demo.factory.model.kfc.ChinaChickenWings;
import com.demo.factory.model.kfc.ChinaFrenchFries;
import com.demo.factory.model.kfc.ChinaHamburg;
/**
* 實際工廠
*/
public class ChinaKfcFactory implements IKfcFactory {
@Override
public Hamburg createHamburg(int num) {
return new ChinaHamburg(num);
}
@Override
public ChickenWings createChickenWings(int num) {
return new ChinaChickenWings(num);
}
@Override
public FrenchFries createFrenchFries(int num) {
return new ChinaFrenchFries(num);
}
@Override
public Beverage createBeverage(int num) {
return new ChinaBeverage(num);
}
}
客戶類:
package com.demo.factory.custom;
import com.demo.factory.itf.IKfcFactory;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
/**
* 客戶類
*/
public class Customer {
private IKfcFactory kfcFactory;
public Customer(IKfcFactory kfcFactory) {
this.kfcFactory = kfcFactory;
}
public float orderHamburg(int num) {
Hamburg hamburg = kfcFactory.createHamburg(num);
hamburg.printMessage();
return hamburg.totalPrice();
}
public float orderChickenWings(int num) {
ChickenWings chickenWings = kfcFactory.createChickenWings(num);
chickenWings.printMessage();
return chickenWings.totalPrice();
}
public float orderFrenchFries(int num) {
FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
frenchFries.printMessage();
return frenchFries.totalPrice();
}
public float orderBeverage(int num) {
Beverage beverage = kfcFactory.createBeverage(num);
beverage.printMessage();
return beverage.totalPrice();
}
}
轉載于:https://www.cnblogs.com/arctique/p/5747117.html