Head First设计模式学习笔记-------(4.1)工厂模式

这一章将给大家带来一个有趣的模式------工厂模式

开始先给大家看一个简单的例子:



如果按照上面的设计方式,那么当你需要修改比萨类型时,就需要修改这个文件的代码了,但是你发现,下面的比萨处理方式是不会改变的,那能不能把下面部分的代码分离出来呢,我们来试试看。


我们把分离出来的代码生成一个新的对象,这个新对象就被称为“工厂”,工厂处理创建对象的细节。

下面我们来看看这个我们创建的简单工厂的具体代码。

SimplePizzaFactory类:

public class SimplePizzaFactory {              //这个就是我们自己定义的工厂类
	public Pizza createPizza(String type) {    //这个工厂内定义一个createPizza()方法。所有用户用这个方法来实例化新对象。
		Pizza pizza = null;
		
		if (type.equals("cheese")) {
			pizza = new CheesePizza();
		} else if (type.equals("pepperoni")) {
			pizza = new PepperoniPizza();
		} else if (type.equals("clam")) {
			pizza = new ClamPizza();
		} else if (type.equals("veggie")) {
			pizza = new VeggiePizza();
		}
		
		return pizza;
	}

}
PizzaStore类:
public class PizzaStore {
	SimplePizzaFactory factory;     //现在我们为PizzaStore加上一个对SimplePizzaFactory的引用
	
	public PizzaStore(SimplePizzaFactory factory) {
		this.factory = factory;     //PizzaStore的构造器,需要一个工厂作为参数
	}
	
	public Pizza orderPizza(String type) {
		Pizza pizza;
		
		pizza = factory.createPizza(type);  //orderPizza方法通过简单传入订单类型来使用工厂创建比萨
		
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.bos();
		return pizza;
	}

}
这样以来,一个简单工厂的例子就大致写完了,是不是很简单,什么?你问工厂模式就是这个吗?  当然不是,而且简单工厂并不是一个设计模式,到可以说是一种编程习惯。

前面的简单工厂只是让大家先熟悉下工厂这个概念,接下来要进入主题了--------工厂模式

比萨店越开越大,有许多地方都想开加盟店,但是不同地方的口味和比萨处理方式都不一样,这该怎么办呢,相比大家都有办法了吧,对,就是把PizzaStore定义为超类,我们来看下新设计的类图吧。


看了类图,再让我们看看处理一个订单的流程吧,让我们更加了解这个系统的流程。


好了,类图和流程都看完了,终于可以代码实现了。

Pizza类:

import java.util.ArrayList;

public class Pizza {
	String name;          
	String dough;
	String sauce;
	ArrayList toppings = new ArrayList();
	
	void prepare() {
		System.out.println("Preparing " + name);
		System.out.println("Tossing dough");
		System.out.println("Adding sauce");
		System.out.println("Adding toppings: ");
		for (int i = 0; i < toppings.size(); i++) {
			System.out.println("   " + toppings.get(i));
		}
	}
	
	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 bos");
	}
	
	public String getName() {
		return name;
	}

}
NYStyleCheesePizza类:
public class NYStyleCheesePizza extends Pizza{
	public NYStyleCheesePizza() {
		name = "NY Style Sauce and Cheese Pizza";
		dough = "Thin Crust Dough";
		sauce = "Marinara Sauce";
		
		toppings.add("Grated Reggiano Cheese");
	}

}
认识工厂方法模式的时刻终于到了

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值