head first------------------抽象工厂模式
浅谈head first设计模式中的抽象工厂模式,首先,抽象工厂模式定义为:提供一个接口,用于创建相关或依赖对象的家族,而不需要确定具体的类。其与工厂模式:定义了一个创建对象的接口,但是由子类确定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
其中,在工厂模式的设计中有一个重要的原则,即是:依赖倒置原则(Dependency Inversion Principle)--------不能让高层组件依赖低层组件,而且,不管是高层组件还是低层组件,两者都应该依赖于抽象。
下面是抽象工厂代码的实现例子
package com.clark.abstractfactory.abstractclass;
/**
* abstract factory Pizza class
* @author Administrator
*
*/
public abstract class Pizza {
//pizza name
public String name;
//made up of pizza resources
public Dough dough;
public Sauce sauce;
public Cheese cheese;
//declared prepare method is abstract type
public abstract void prepare();
public void bake(){
System.out.println("Bake for 25 minutes at 350");
}
public void cut(){
System.out.println("Cutting the pizza into diagonal slice");
}
public void box(){
System.out.println("Place pizza in official PizzaStore box");
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
package com.clark.abstractfactory.abstractclass;
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 com.clark.abstractfactory.abstractclass;
/**
* 干酪原料
* @author Administrator
*
*/
public abstract class Cheese {
public String print(){
return "奶酪";
}
public Cheese(String type){
System.out.println(type+print());
}
}
package com.clark.abstractfactory.abstractclass;
public abstract class Dough{
public String print(){
return "原料面团";
}
public Dough(String type){
System.out.println(type+print());
}
}
package com.clark.abstractfactory.abstractclass;
/**
* 酱油原料
* @author Administrator
*
*/
public abstract class Sauce {
public String print(){
return "番茄酱";
}
public Sauce(String type){
System.out.println(type+print());
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
/**
* 干酪 pizza
* @author Administrator
*
*/
public class CheesePizza extends Pizza {
public PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
import com.clark.abstractfactory.abstractclass.Dough;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* Chicago pizza
* @author Administrator
*
*/
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough(){
return new ThickCrustDough("ThickCrust");
}
@Override
public Sauce createSauce() {
return new PlumTomatoSauce("PlumTomato");
}
@Override
public Cheese createCheese() {
return new ReggianoCheese("Reggiano");
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
import com.clark.abstractfactory.abstractclass.PizzaStore;
public class ChicagoPizzaStore extends PizzaStore{
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("dough")) {
pizza = new DoughPizza(ingredientFactory);
pizza.setName("Chicago Style Dough Pizza");
} else if (type.equals("sauce")) {
pizza = new SaucePizza(ingredientFactory);
pizza.setName("Chicago Style Sauce Pizza");
}
return pizza;
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
/**
* 干酪 pizza
* @author Administrator
*
*/
public class DoughPizza extends Pizza {
public PizzaIngredientFactory ingredientFactory;
public DoughPizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* 纯番茄酱原料
* @author Administrator
*
*/
public class MarinaraSauce extends Sauce {
public MarinaraSauce(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
import com.clark.abstractfactory.abstractclass.Dough;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* 纽约风味的披萨pizza
* @author Administrator
*
*/
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough(){
return new ThinCrustDough("ThinCrust");
}
@Override
public Sauce createSauce() {
return new MarinaraSauce("Marinara");
}
@Override
public Cheese createCheese() {
return new ReggianoCheese("Reggiano");
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
import com.clark.abstractfactory.abstractclass.PizzaStore;
/**
* 纽约披萨生产店
* @author Administrator
*
*/
public class NYPizzaStore extends PizzaStore {
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("dough")) {
pizza = new DoughPizza(ingredientFactory);
pizza.setName("New York Style Dough Pizza");
} else if (type.equals("sauce")) {
pizza = new SaucePizza(ingredientFactory);
pizza.setName("New York Style Sauce Pizza");
}
return pizza;
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
import com.clark.abstractfactory.abstractclass.Dough;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* create resources factory
* Its production including dough,sauce,cheese,veggie,pepperoni,clam
* @author Administrator
*
*/
public interface PizzaIngredientFactory {
public Dough createDough();//生产面团
public Sauce createSauce();//生产酱油
public Cheese createCheese();//生产干酪
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* 梨形番茄酱原料
* @author Administrator
*
*/
public class PlumTomatoSauce extends Sauce {
public PlumTomatoSauce(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
/**
* reggiano cheese
* @author Administrator
*
*/
public class ReggianoCheese extends Cheese {
public ReggianoCheese(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
/**
* 干酪 pizza
* @author Administrator
*
*/
public class SaucePizza extends Pizza {
public PizzaIngredientFactory ingredientFactory;
public SaucePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Dough;
/**
* 瘦面团
* @author Administrator
*
*/
public class ThickCrustDough extends Dough {
public ThickCrustDough(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Dough;
/**
* 瘦面团
* @author Administrator
*
*/
public class ThinCrustDough extends Dough {
public ThinCrustDough(String type) {
super(type);
}
}
=================下面是测试类============================
package com.clark.abstractfactory.abstractclass;
import com.clark.abstractfactory.CheesePizza;
import com.clark.abstractfactory.ChicagoPizzaIngredientFactory;
import com.clark.abstractfactory.ChicagoPizzaStore;
import com.clark.abstractfactory.MarinaraSauce;
import com.clark.abstractfactory.NYPizzaIngredientFactory;
import com.clark.abstractfactory.NYPizzaStore;
import com.clark.abstractfactory.PizzaIngredientFactory;
import com.clark.abstractfactory.ReggianoCheese;
import com.clark.abstractfactory.ThickCrustDough;
public class TestAbstractFactory {
public static void main(String[] args) {
//new york pizza
System.out.println("========纽约风味的披萨==================");
PizzaStore nyPizzaStore=new NYPizzaStore();
PizzaIngredientFactory ingredientFactory=new NYPizzaIngredientFactory();
Pizza pizza=nyPizzaStore.orderPizza("cheese");
System.out.println("=============芝加哥风味的披萨===========");
//Chicago pizza
PizzaStore chicagoPizzaStore=new ChicagoPizzaStore();
PizzaIngredientFactory chicagoIngredient=new ChicagoPizzaIngredientFactory();
Pizza chicago=chicagoPizzaStore.orderPizza("sauce");
}
}
==============测试结果为====================
========纽约风味的披萨==================
--- Making a New York Style Cheese Pizza ---
Preparing New York Style Cheese Pizza
ThinCrust原料面团
Marinara番茄酱
Reggiano奶酪
Bake for 25 minutes at 350
Cutting the pizza into diagonal slice
Place pizza in official PizzaStore box
=============芝加哥风味的披萨===========
--- Making a Chicago Style Sauce Pizza ---
Preparing Chicago Style Sauce Pizza
ThickCrust原料面团
PlumTomato番茄酱
Reggiano奶酪
Bake for 25 minutes at 350
Cutting the pizza into diagonal slice
Place pizza in official PizzaStore box
其中,在工厂模式的设计中有一个重要的原则,即是:依赖倒置原则(Dependency Inversion Principle)--------不能让高层组件依赖低层组件,而且,不管是高层组件还是低层组件,两者都应该依赖于抽象。
下面是抽象工厂代码的实现例子
package com.clark.abstractfactory.abstractclass;
/**
* abstract factory Pizza class
* @author Administrator
*
*/
public abstract class Pizza {
//pizza name
public String name;
//made up of pizza resources
public Dough dough;
public Sauce sauce;
public Cheese cheese;
//declared prepare method is abstract type
public abstract void prepare();
public void bake(){
System.out.println("Bake for 25 minutes at 350");
}
public void cut(){
System.out.println("Cutting the pizza into diagonal slice");
}
public void box(){
System.out.println("Place pizza in official PizzaStore box");
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
package com.clark.abstractfactory.abstractclass;
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 com.clark.abstractfactory.abstractclass;
/**
* 干酪原料
* @author Administrator
*
*/
public abstract class Cheese {
public String print(){
return "奶酪";
}
public Cheese(String type){
System.out.println(type+print());
}
}
package com.clark.abstractfactory.abstractclass;
public abstract class Dough{
public String print(){
return "原料面团";
}
public Dough(String type){
System.out.println(type+print());
}
}
package com.clark.abstractfactory.abstractclass;
/**
* 酱油原料
* @author Administrator
*
*/
public abstract class Sauce {
public String print(){
return "番茄酱";
}
public Sauce(String type){
System.out.println(type+print());
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
/**
* 干酪 pizza
* @author Administrator
*
*/
public class CheesePizza extends Pizza {
public PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
import com.clark.abstractfactory.abstractclass.Dough;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* Chicago pizza
* @author Administrator
*
*/
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough(){
return new ThickCrustDough("ThickCrust");
}
@Override
public Sauce createSauce() {
return new PlumTomatoSauce("PlumTomato");
}
@Override
public Cheese createCheese() {
return new ReggianoCheese("Reggiano");
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
import com.clark.abstractfactory.abstractclass.PizzaStore;
public class ChicagoPizzaStore extends PizzaStore{
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("dough")) {
pizza = new DoughPizza(ingredientFactory);
pizza.setName("Chicago Style Dough Pizza");
} else if (type.equals("sauce")) {
pizza = new SaucePizza(ingredientFactory);
pizza.setName("Chicago Style Sauce Pizza");
}
return pizza;
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
/**
* 干酪 pizza
* @author Administrator
*
*/
public class DoughPizza extends Pizza {
public PizzaIngredientFactory ingredientFactory;
public DoughPizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* 纯番茄酱原料
* @author Administrator
*
*/
public class MarinaraSauce extends Sauce {
public MarinaraSauce(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
import com.clark.abstractfactory.abstractclass.Dough;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* 纽约风味的披萨pizza
* @author Administrator
*
*/
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough(){
return new ThinCrustDough("ThinCrust");
}
@Override
public Sauce createSauce() {
return new MarinaraSauce("Marinara");
}
@Override
public Cheese createCheese() {
return new ReggianoCheese("Reggiano");
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
import com.clark.abstractfactory.abstractclass.PizzaStore;
/**
* 纽约披萨生产店
* @author Administrator
*
*/
public class NYPizzaStore extends PizzaStore {
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("dough")) {
pizza = new DoughPizza(ingredientFactory);
pizza.setName("New York Style Dough Pizza");
} else if (type.equals("sauce")) {
pizza = new SaucePizza(ingredientFactory);
pizza.setName("New York Style Sauce Pizza");
}
return pizza;
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
import com.clark.abstractfactory.abstractclass.Dough;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* create resources factory
* Its production including dough,sauce,cheese,veggie,pepperoni,clam
* @author Administrator
*
*/
public interface PizzaIngredientFactory {
public Dough createDough();//生产面团
public Sauce createSauce();//生产酱油
public Cheese createCheese();//生产干酪
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Sauce;
/**
* 梨形番茄酱原料
* @author Administrator
*
*/
public class PlumTomatoSauce extends Sauce {
public PlumTomatoSauce(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Cheese;
/**
* reggiano cheese
* @author Administrator
*
*/
public class ReggianoCheese extends Cheese {
public ReggianoCheese(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Pizza;
/**
* 干酪 pizza
* @author Administrator
*
*/
public class SaucePizza extends Pizza {
public PizzaIngredientFactory ingredientFactory;
public SaucePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Dough;
/**
* 瘦面团
* @author Administrator
*
*/
public class ThickCrustDough extends Dough {
public ThickCrustDough(String type) {
super(type);
}
}
package com.clark.abstractfactory;
import com.clark.abstractfactory.abstractclass.Dough;
/**
* 瘦面团
* @author Administrator
*
*/
public class ThinCrustDough extends Dough {
public ThinCrustDough(String type) {
super(type);
}
}
=================下面是测试类============================
package com.clark.abstractfactory.abstractclass;
import com.clark.abstractfactory.CheesePizza;
import com.clark.abstractfactory.ChicagoPizzaIngredientFactory;
import com.clark.abstractfactory.ChicagoPizzaStore;
import com.clark.abstractfactory.MarinaraSauce;
import com.clark.abstractfactory.NYPizzaIngredientFactory;
import com.clark.abstractfactory.NYPizzaStore;
import com.clark.abstractfactory.PizzaIngredientFactory;
import com.clark.abstractfactory.ReggianoCheese;
import com.clark.abstractfactory.ThickCrustDough;
public class TestAbstractFactory {
public static void main(String[] args) {
//new york pizza
System.out.println("========纽约风味的披萨==================");
PizzaStore nyPizzaStore=new NYPizzaStore();
PizzaIngredientFactory ingredientFactory=new NYPizzaIngredientFactory();
Pizza pizza=nyPizzaStore.orderPizza("cheese");
System.out.println("=============芝加哥风味的披萨===========");
//Chicago pizza
PizzaStore chicagoPizzaStore=new ChicagoPizzaStore();
PizzaIngredientFactory chicagoIngredient=new ChicagoPizzaIngredientFactory();
Pizza chicago=chicagoPizzaStore.orderPizza("sauce");
}
}
==============测试结果为====================
========纽约风味的披萨==================
--- Making a New York Style Cheese Pizza ---
Preparing New York Style Cheese Pizza
ThinCrust原料面团
Marinara番茄酱
Reggiano奶酪
Bake for 25 minutes at 350
Cutting the pizza into diagonal slice
Place pizza in official PizzaStore box
=============芝加哥风味的披萨===========
--- Making a Chicago Style Sauce Pizza ---
Preparing Chicago Style Sauce Pizza
ThickCrust原料面团
PlumTomato番茄酱
Reggiano奶酪
Bake for 25 minutes at 350
Cutting the pizza into diagonal slice
Place pizza in official PizzaStore box