head first-------abstract factory pattern

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











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值