抽象工厂模式定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

产品族是指位于不同等级结构中,功能相关联的产品组成的家族。
产品等级:产品的继承结构。
结构包含四个角色:
- package abstractFactory.Pizza;
- //抽象工厂:披萨原料工厂
- public interface PizzaIngredientFactory {
- //封装了制造产品原料的方法,其中每个原料都是一个类
- public Dough createDough();//面团
- public Sauce createSauce();//酱料
- public Cheese createCheese();//芝士
- public Clams createClam();
- }
- package abstractFactory.Pizza;
- //抽象工厂:抽象披萨店(总店)
- public abstract class PizzaStore {
- //生产具体类型的披萨店(每一个子店口味不一样,这里就是产生不同子店)
- protected abstract Pizza createPizza(String item);
-
- public Pizza orderPizza(String type) {
- Pizza pizza = createPizza(type);
- System.out.println("--- Making a " + pizza.getName() + " ---");
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- }
- package abstractFactory.Pizza;
- //芝加哥原料工厂
- public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
-
- @Override
- public Dough createDough() {
- // TODO Auto-generated method stub
- return new ThickCrustDough();
- }
-
- @Override
- public Sauce createSauce() {
- // TODO Auto-generated method stub
- return new PlumTomatoSauce();
- }
-
- @Override
- public Cheese createCheese() {
- // TODO Auto-generated method stub
- return new MozzarellaCheese();
- }
-
- @Override
- public Clams createClam() {
- // TODO Auto-generated method stub
- return new FrozenClams();
- }
-
- }
- package abstractFactory.Pizza;
- //纽约原料工厂
- public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
-
- @Override
- public Dough createDough() {
- // TODO Auto-generated method stub
- return new ThinCrustDough();
- }
-
- @Override
- public Sauce createSauce() {
- // TODO Auto-generated method stub
- return new MarinaraSauce();
- }
-
- @Override
- public Cheese createCheese() {
- // TODO Auto-generated method stub
- return new ReggianoCheese();
- }
-
- @Override
- public Clams createClam() {
- // TODO Auto-generated method stub
- return new FreshClams();
- }
-
- }
- package abstractFactory.Pizza;
- //具体披萨分店:芝加哥分店
- public class ChicagoPizzaStore extends PizzaStore {
-
- @Override
- protected Pizza createPizza(String item) {
- // TODO Auto-generated method stub
- Pizza pizza = null;
- PizzaIngredientFactory ingredientFactory =
- new ChicagoPizzaIngredientFactory();
-
- if (item.equals("cheese")) {
-
- pizza = new CheesePizza(ingredientFactory);
- pizza.setName("Chicago Style Cheese Pizza");
-
- } else if (item.equals("clam")) {
-
- pizza = new ClamPizza(ingredientFactory);
- pizza.setName("Chicago Style Clam Pizza");
-
- }
- return pizza;
- }
- }
- package abstractFactory.Pizza;
- //具体披萨分店:纽约分店
- public class NYPizzaStore extends PizzaStore {
-
- @Override
- protected Pizza createPizza(String item) {
- // TODO Auto-generated method stub
- Pizza pizza = null;
- PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
- if (item.equals("cheese")) {
-
- pizza = new CheesePizza(ingredientFactory);
- pizza.setName("New York Style Cheese Pizza");
-
- } else if (item.equals("clam")) {
-
- pizza = new ClamPizza(ingredientFactory);
- pizza.setName("New York Style Clam Pizza");
-
- }
- return pizza;
-
- }
-
- }
- package abstractFactory.Pizza;
- //抽象产品:披萨原料接口,面团
- public interface Dough {
- public String toString();
- }
- package abstractFactory.Pizza;
- //抽象产品:披萨原料接口,酱料
- public interface Sauce {
- public String toString();
- }
- package abstractFactory.Pizza;
- //抽象产品:披萨原料接口,芝士
- public interface Cheese {
- public String toString();
- }
- package abstractFactory.Pizza;
- //抽象产品:,披萨原料接口
- public interface Clams {
- public String toString();
- }
- package abstractFactory.Pizza;
- //抽象产品:披萨抽象类
- public abstract class Pizza {
- String name;
- Dough dough;
- Sauce sauce;
- Cheese cheese;
- 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");
- }
-
- void setName(String name) {
- this.name = name;
- }
-
- String getName() {
- return name;
- }
-
- public String toString() {
- StringBuffer result = new StringBuffer();
- result.append("---- " + name + " ----\n");
- if (dough != null) {
- result.append(dough);
- result.append("\n");
- }
- if (sauce != null) {
- result.append(sauce);
- result.append("\n");
- }
- if (cheese != null) {
- result.append(cheese);
- result.append("\n");
- }
- if (clam != null) {
- result.append(clam);
- result.append("\n");
- }
- return result.toString();
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应的原料工厂:ChicagoPizzaIngredientFactory
- public class ThickCrustDough implements Dough {
- public String toString() {
- return "ThickCrust style extra thick crust dough";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应的原料工厂:NYPizzaIngredientFactory
- public class ThinCrustDough implements Dough {
- public String toString() {
- return "Thin Crust Dough";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应原料工厂:ChicagoPizzaIngredientFactory
- public class PlumTomatoSauce implements Sauce {
- public String toString() {
- return "Tomato sauce with plum tomatoes";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应的原料工厂:NYPizzaIngredientFactory
- public class MarinaraSauce implements Sauce {
- public String toString() {
- return "Marinara Sauce";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应原料工厂ChicagoPizzaIngredientFactory
- public class MozzarellaCheese implements Cheese {
- public String toString() {
- return "Shredded Mozzarella";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应原料工厂NYPizzaIngredientFactory
- public class ReggianoCheese implements Cheese {
- public String toString() {
- return "Reggiano Cheese";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应的原料工厂:ChicagoPizzaIngredientFactory
- public class FrozenClams implements Clams {
- public String toString() {
- return "Frozen Clams from Chesapeake Bay";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨原料,对应的原料工厂:NYPizzaIngredientFactory
- public class FreshClams implements Clams {
- public String toString() {
- return "Fresh Clams from Long Island Sound";
- }
- }
- package abstractFactory.Pizza;
- //具体披萨子类
- public class CheesePizza extends Pizza {
- PizzaIngredientFactory ingredientFactory;
- public CheesePizza(PizzaIngredientFactory ingredientFactory) {
- this.ingredientFactory = ingredientFactory;
- }
- @Override
- void prepare() {
- // TODO Auto-generated method stub
- System.out.println("Preparing " + name);
- dough = ingredientFactory.createDough();
- sauce = ingredientFactory.createSauce();
- cheese = ingredientFactory.createCheese();
- }
- }
- package abstractFactory.Pizza;
- //具体披萨子类
- public class ClamPizza extends Pizza {
- PizzaIngredientFactory ingredientFactory;
- public ClamPizza(PizzaIngredientFactory ingredientFactory) {
- this.ingredientFactory = ingredientFactory;
- }
- @Override
- void prepare() {
- // TODO Auto-generated method stub
- System.out.println("Preparing " + name);
- dough = ingredientFactory.createDough();
- sauce = ingredientFactory.createSauce();
- cheese = ingredientFactory.createCheese();
- }
- }
- package abstractFactory.Pizza;
-
- public class Test {
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- PizzaStore nyStore = new NYPizzaStore();
- PizzaStore chicagoStore = new ChicagoPizzaStore();
- //纽约子店点餐
- Pizza pizza = nyStore.orderPizza("cheese");
- System.out.println("Ethan ordered a " + pizza + "\n");
- //芝加哥子店点餐
- pizza = chicagoStore.orderPizza("cheese");
- System.out.println("Joel ordered a " + pizza + "\n");
- //纽约子店点餐
- pizza = nyStore.orderPizza("clam");
- System.out.println("Ethan ordered a " + pizza + "\n");
- //芝加哥子店点餐
- pizza = chicagoStore.orderPizza("clam");
- System.out.println("Joel ordered a " + pizza + "\n");
- }
-
- }


UML图对比


工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程。