工厂方法模式

本文介绍了一种使用工厂方法模式创建不同类型Pizza的实现方案。通过定义抽象接口并交由子类负责实例化,使得代码更加灵活可扩展。示例中包含了纽约和芝加哥风格的多种Pizza制作流程。

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

核心:只持有抽象的接口引用,由子类去决定实例的创建,将实例化推到子类中去。

同样采用Pizza的例子,当纽约(NY)和芝加哥(Chicago)都开了pizza店,且者两个地方的同类型Pizza味道不同。可以构建如下类:


可以看到createPizza在父类中申明为抽象的,用户首先得创建一个店,NYPizzaStore store,当用户调用AbstractPizzaStore.orderPizza()时,orderPizza()转而调用AbstractPizzaStore.createPizza方法,由于这个方法是抽象的,所以调用的是子类的NYPizzaStore.createPizza(),这个方法根据字符串type返回不同的Pizza。代码如下:

首先是Pizza超类

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public abstract class Pizza {
    abstract void eat();
}

接着ChicagoPizza群

//ChicagoCheesePizza

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class ChicagoCheesePizza extends Pizza{
    @Override
      void eat() {
        System.out.println("ChicagoCheesePizza");
    }
}
//ChicagoGreekPizza
package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class ChicagoGreekPizza extends Pizza{
    @Override
    void eat() {
        System.out.println("ChicagoGreekPizza");
    }
}
//ChicagoHotPizza

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class ChicagoHotPizza extends Pizza{
    @Override
    void eat() {
        System.out.println("ChicagoHotPizza");
    }
}


NYPizza群

//NYCheesePizza

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class NYCheesePizza extends Pizza {
    @Override
    void eat() {
        System.out.println("NYCheesePizza");
    }
}

//NYGreekPizza

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class NYGreekPizza extends Pizza{
    @Override
    void eat() {
        System.out.println("NYGreekPizza");
    }
}
//NYHotPizza

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class NYHotPizza extends Pizza{
    @Override
    void eat() {
        System.out.println("NYHotPizza");
    }

}


然后是store(工厂)超类

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */

public abstract class PizzaStore {
    public Pizza orderPizza(String type){
        Pizza pizza=createPizza(type);
        return pizza;
    }

    protected abstract Pizza createPizza(String type);

}

//ChicagoPizzaStore

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class ChicagoPizzaStore extends PizzaStore {
    @Override
    public Pizza createPizza(String type) {
        Pizza pizza=null;
        if(type.equals("Cheese")){
            pizza=new ChicagoCheesePizza();
        }else if(type.equals("Greek")){
            pizza=new ChicagoGreekPizza();
        }else{
            pizza=new ChicagoHotPizza();
        }
        return pizza;
    }
}
//NYPizzaStore

package Factory.MethodFactory;


/**
 * Created by sgzhang on 2015/8/12.
 */
public class NYPizzaStore extends PizzaStore {
    @Override
    public Pizza createPizza(String type) {
        Pizza pizza=null;
        if(type.equals("Cheese")){
            pizza=new NYCheesePizza();
        }else if(type.equals("Greek")){
            pizza=new NYGreekPizza();
        }else{
            pizza=new NYHotPizza();
        }
        return pizza;
    }
}

大功告成,接下来就是测试了

package Factory.MethodFactory;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class FactoryRun {
    public static void main(String[] args){
        PizzaStore pizzaStore=new ChicagoPizzaStore();
        Pizza pizza=pizzaStore.orderPizza("Cheese");
        pizza.eat();
    }
}

可以看到打印出来了

ChicagoCheesePizza










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值