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