简述
下面以Pizza的原料工厂举例说明。抽象工厂抽象定义能生产的产品,具体生产何种产品由子类决定。
代码
原料工厂
/**
* Pizza原料工厂
* @author ydifnd
* @date 2019.10.25
*/
public interface PizzaIngredientFactory {
Dough createDough();
Sauce createSauce();
}
/**
* 北京Pizza原料工厂
* @author ydifnd
* @date 2019.10.25
*/
public class BeijingIngredientFactory implements PizzaIngredientFactory{
@Override
public Dough createDough() {
return new BeijingDough();
}
@Override
public Sauce createSauce() {
return new BeijingSauce();
}
}
/**
* 上海Pizza原料工厂
* @author ydifnd
* @date 2019.10.25
*/
public class ShangHaiIngredientFactory implements PizzaIngredientFactory{
@Override
public Dough createDough() {
return new ShangHaiDough();
}
@Override
public Sauce createSauce() {
return new ShangHaiSauce();
}
}
/**
* 面粉
* @author ydifnd
* @date 2019.10.25
*/
public class Dough {
}
public class BeijingDough extends Dough{
}
public class ShangHaiDough extends Dough{
}
Pizza
package com.ydfind.gof.factory.abstractfactory;
import lombok.Data;
/**
* 制作pizza 接口
* @author ydfind
* @date 2019.10.25
*/
@Data
public abstract class Pizza2 {
private Dough dough;
private Sauce sauce;
private PizzaIngredientFactory ingredientFactory;
public Pizza2(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory = ingredientFactory;
}
/**
* 准备
*/
public void prepare(){
this.setDough(this.getIngredientFactory().createDough());
this.setSauce(this.getIngredientFactory().createSauce());
}
/**
* 烘烤
*/
public void bake(){
}
/**
* 切片
*/
public void cut(){
}
/**
* 装盒
*/
public void box(){
}
}
package com.ydfind.gof.factory.abstractfactory;
/**
* 奶酪Pizza
* @author ydfind
* @date 2019.10.14
*/
public class CheesePizza2 extends Pizza2 {
public CheesePizza2(PizzaIngredientFactory ingredientFactory) {
super(ingredientFactory);
}
@Override
public void prepare() {
this.setDough(this.getIngredientFactory().createDough());
this.setSauce(this.getIngredientFactory().createSauce());
}
}
/**
* 素食Pizza
* @author ydfind
* @date 2019.10.25
*/
public class VeggiePizza2 extends Pizza2 {
public VeggiePizza2(PizzaIngredientFactory ingredientFactory) {
super(ingredientFactory);
}
@Override
public void prepare() {
this.setDough(this.getIngredientFactory().createDough());
this.setSauce(this.getIngredientFactory().createSauce());
}
}
使用示例
public abstract class PizzaStore2 {
public static final String CHEESE_PIZZA = "奶酪Pizza";
public static final String VEGGIE_PIZZA = "素食Pizza";
public Pizza2 orderPizza(String type){
Pizza2 pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza2 createPizza(String type);
}
/**
* 北京Pizza店
* @author ydifnd
* @date 2019.10.25
*/
public class BeijingPizzaStore2 extends PizzaStore2 {
@Override
protected Pizza2 createPizza(String type) {
switch (type){
case CHEESE_PIZZA:
return new CheesePizza2(new BeijingIngredientFactory());
case VEGGIE_PIZZA:
return new VeggiePizza2(new BeijingIngredientFactory());
default:
return null;
}
}
}
/**
* 上海Pizza店
* @author ydifnd
* @date 2019.10.25
*/
public class ShangHaiPizzaStore2 extends PizzaStore2 {
@Override
protected Pizza2 createPizza(String type) {
switch (type){
case CHEESE_PIZZA:
return new CheesePizza2(new ShangHaiIngredientFactory());
case VEGGIE_PIZZA:
return new VeggiePizza2(new ShangHaiIngredientFactory());
default:
return null;
}
}
}
测试
@Test
public void testFactory(){
System.out.println("*********************抽象工厂 测试********************************");
PizzaStore2 shanghaiStore = new ShangHaiPizzaStore2();
PizzaStore2 beijingStore = new ShangHaiPizzaStore2();
shanghaiStore.orderPizza(PizzaStore2.CHEESE_PIZZA);
beijingStore.orderPizza(PizzaStore2.VEGGIE_PIZZA);
}