抽象工厂模式:
此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类.
解决什么问题:
抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦.
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();
}
}
浙公网安备 33010602011771号