您的位置:首页 > 编程语言 > Java开发

java工厂方法模式

2014-02-28 22:43 330 查看
工厂方法模式:定义了一个创建对象的接口,但是由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
 
设计原则:要依赖抽象,不要依赖具体类;
 
在熟悉工厂模式前,先了解下简单工厂,因为往往把这种编程方法误以为是“工厂模式”;

《head first 设计模式》中的Pizza店卖pizza的设计,如下所示:



具体的代码如下:(因为比较简单就不废话了)class Pizza{
public void preprare(){};
public void bake(){};
public void cut(){};
public void box(){};
}
class SimplePizzaFactory{
public Pizza CreatePizza(String type){
Pizza pizza =null;
if(type.equals("cheese")){
pizza = new CheesePizza();
}else if(type.equals("veggie")){
pizza = new VeggiePizza();
}
return pizza;
}
}
class CheesePizza extends Pizza{

}
class VeggiePizza extends Pizza{

}
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory){
this.factory = factory;
}
public Pizza orderPizza(String type){
Pizza pizza=factory.CreatePizza(type);
pizza.preprare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}

问题出现了,假如虽然都是cheese口味,但是每个地方的做法不一样,那么我们要怎么解决呢?以下方法可以解决:

工厂方法模式:通过子类让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。类图如下所示:



咋看之下,有点纳闷,为什么非要这样呢?跟以往有什么不一样的地方呢?

因为PizzaStore抽象类中的orderPizza()方法中有具体的实现方法,此方法与pizza的具体对象有关;

产品类:



详细代码如下所示:

abstract class PizzaStore {
public Pizza orderPizza(String type){
Pizza pizza=CreatePizza(type);
pizza.preprare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
public abstract Pizza CreatePizza(String type);
}
class NYPizzaStore extends PizzaStore{
@Override
public Pizza CreatePizza(String type) {
// TODO Auto-generated method stub
Pizza pizza =null;
if(type.equals("cheese")){
pizza = new NYCheesePizza();
}else if(type.equals("veggie")){
pizza = new NYVeggiePizza();
}
return pizza;
}
}

abstract class Pizza{
String name;
String dough;
String sauce;

public void preprare(){
System.out.println(name+dough+sauce);
}
public void bake(){
System.out.println("Bake for 25 minutes");
}
public void cut(){
System.out.println("has been cut");
}
public void box(){
System.out.println("has placed pizza in box");
}
}
class NYVeggiePizza extends Pizza{
public NYVeggiePizza(){
name = "NY style Veggie";
dough = "Thin";
sauce = "Marinara";
}
}
class NYCheesePizza extends Pizza{
public NYCheesePizza(){
name = "NY style Cheese";
dough = "Thin";
sauce = "Marinara";
}
}

??简单工厂与工厂方法模式的区别?

答:简单工厂把全部的事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  工厂方法模式