抽象工厂模式
2018-01-22 本文已影响11人
阳光的技术小栈
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
示例—披萨店
一家披萨店,有很多种口味的披萨可接收下单。为了扩展加盟店,每个披萨从制作到最后出炉,都有一套统一标准化的流程。流程包括准备所有的披萨的配料、准备制作(加酱料、揉面团等)、烘烤、切角、装盒。披萨本身有自己的名称、需要的生面团、酱料以及其他配料。现有纽约和芝加哥两个加盟店,虽然他们店中的披萨种类都一样,但实际出来的口味是不同的,比如纽约芝士披萨(大蒜蕃茄酱以及薄饼)和芝加哥芝士披萨(小蕃茄酱以及厚饼)。所有加盟店的流程以及披萨的种类都是一致的。所有的配料都要由工厂统一生产加工,每个地方可以开一家配料工厂。
UML图表示
抽象工厂-披萨店代码演示
配料工厂接口
package AbstractFactory;
interface Dough {}
interface Sauce {}
interface Cheese {}
interface Veggies {}
interface Pepperoni {}
interface Clams {}
public interface PizzaIngredientFactory {
Dough createDough();
Sauce createSauce();
Cheese createCheese();
Veggies[] createVeggies();
Pepperoni createPepperoni();
Clams createClam();
}
纽约配料工厂实现类
package AbstractFactory;
class ThinCrustDough implements Dough {}
class MarinaraSauce implements Sauce {}
class ReggianoCheese implements Cheese {}
class Garlic implements Veggies {}
class Onion implements Veggies {}
class Mushroom implements Veggies {}
class RedPepper implements Veggies {}
class SlicedPepperoni implements Pepperoni {}
class FreshClams implements Clams {}
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
return new ThinCrustDough();
}
@Override
public Sauce createSauce() {
return new MarinaraSauce();
}
@Override
public Cheese createCheese() {
return new ReggianoCheese();
}
@Override
public Veggies[] createVeggies() {
Veggies veggies[] = {new Garlic(), new Onion(), new Mushroom(), new RedPepper()};
return veggies;
}
@Override
public Pepperoni createPepperoni() {
return new SlicedPepperoni();
}
@Override
public Clams createClam() {
return new FreshClams();
}
}
芝加哥配料工厂实现类
package AbstractFactory;
class ThickCrustDough implements Dough {}
class PlumTomatoSauce implements Sauce {}
class Mozzarella implements Cheese {}
class Spinach implements Veggies {}
class Eggplant implements Veggies {}
class BlackOlives implements Veggies {}
class FrozenClams implements Clams {}
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
return new ThickCrustDough();
}
@Override
public Sauce createSauce() {
return new PlumTomatoSauce();
}
@Override
public Cheese createCheese() {
return new Mozzarella();
}
@Override
public Veggies[] createVeggies() {
Veggies veggies[] = {new Spinach(), new Eggplant(), new BlackOlives()};
return veggies;
}
@Override
public Pepperoni createPepperoni() {
return new SlicedPepperoni();
}
@Override
public Clams createClam() {
return new FrozenClams();
}
}
披萨抽象基类
package AbstractFactory;
public abstract class Pizza {
String name;
Dough dough;
Sauce sauce;
Veggies veggies[];
Cheese cheese;
Pepperoni pepperoni;
Clams clam;
abstract void prepare();
void bake() {
System.out.println("Bake for 25 minutes at 350");
}
void cut() {
System.out.println("Cutting the pizza into diagonal slices");
}
void box(){
System.out.println("Place pizza in official PizzaStore box");
}
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
@Override
public String toString() {
return super.toString();
}
}
芝士披萨子类
package AbstractFactory;
public class CheesePizza extends Pizza{
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory = ingredientFactory;
}
@Override
void prepare() {
System.out.println("Preparing " + name);
dough = ingredientFactory.createDough();
sauce = ingredientFactory.createSauce();
cheese = ingredientFactory.createCheese();
}
}
蚌蛤披萨子类
package AbstractFactory;
public class ClamPizza extends Pizza {
PizzaIngredientFactory ingredientFactory;
public ClamPizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory = ingredientFactory;
}
@Override
void prepare() {
System.out.println("Preparing " + name);
dough = ingredientFactory.createDough();
sauce = ingredientFactory.createSauce();
cheese = ingredientFactory.createCheese();
clam = ingredientFactory.createClam();
}
}
披萨店抽象基类
package AbstractFactory;
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
纽约披萨店子类
package AbstractFactory;
public class NYPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
Pizza pizza = null;
PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
if (type.equals("cheese")) {
pizza = new CheesePizza(ingredientFactory);
pizza.setName("New York Style Cheese Pizza");
}
else if (type.equals("veggie")){
}
else if (type.equals("clam")){
}
else if (type.equals("pepperoni")){
}
return pizza;
}
}
芝加哥披萨店子类
package AbstractFactory;
public class ChicagoPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
Pizza pizza = null;
PizzaIngredientFactory ingredientFactory = new ChicagoPizzaIngredientFactory();
if (type.equals("cheese")) {
pizza = new CheesePizza(ingredientFactory);
pizza.setName("Chicago Style Cheese Pizza");
}
else if (type.equals("veggie")){
}
else if (type.equals("clam")){
}
else if (type.equals("pepperoni")){
}
return pizza;
}
}
披萨下单测试代码
package AbstractFactory;
public class PizzaTestDrive {
public static void main(String[] args) {
PizzaStore nyStore = new NYPizzaStore();
PizzaStore chicagoStore = new ChicagoPizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
pizza = chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
}
}
测试结果
Preparing New York Style Cheese Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a New York Style Cheese Pizza
Preparing Chicago Style Cheese Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Joel ordered a Chicago Style Cheese Pizza