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

本文深入解析抽象工厂模式在头鹰设计模式中的应用,通过实例代码展示如何创建相关或依赖对象的家族,而不需确定具体类。重点介绍了工厂模式的核心原则依赖倒置原则,并通过具体实现案例解释了如何使用抽象工厂模式实现不同类型的披萨制作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值