本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511
工厂方法模式: 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类.
包括:
创建者父类(creator), 包括创建对象的方法(取代new详细的对象, 通过參数创建不同的对象), 和一些主要的方法;
详细创建者(concrete creator), 继承创建者父类, 实现创建对象的方法, 不同參数能够创建不同的对象;
产品类父类(product), 包括产品的基本用法, 被创建者父类(creator)的基本方法使用;
详细产品(concrete creator), 继承产品类父类, 对特定的产品进行定制, 供详细创建者(concrete creator)选择创建;
详细方法:
1. 产品类父类(product), 包括产品的一些基本方法.
代码:
/**
* @time 2014年5月26日
*/
package factory;
import java.util.ArrayList;
/**
* @author C.L.Wang
*
*/
public abstract class Pizza {
String name;
String dough; //生面团
String sauce; //调味汁
ArrayList<String> toppings = new ArrayList<String>(); //装饰
void prepare() {
System.out.println("Preparing " + name);
System.out.println("Tossing dough..." + dough);
System.out.println("Adding sauce..." + 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 box");
}
public String getName() {
return name;
}
}
代码:
/**
* @time 2014年5月26日
*/
package factory;
/**
* @author C.L.Wang
*
*/
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");
}
}
/**
* @time 2014年5月26日
*/
package factory;
/**
* @author C.L.Wang
*
*/
public class ChicagoStyleCheesePizza extends Pizza {
public ChicagoStyleCheesePizza() {
name = "Chicago Style Deep Dish Cheese Pizza";
dough = "Extra Thick Crust Dough";
sauce = "Plum Tomato Sauce";
toppings.add("Shredded Mozzarella Cheese");
}
void cut() {
System.out.println("Cutting the pizza into square slices");
}
}
代码:
/**
* @time 2014年5月26日
*/
package factory;
/**
* @author C.L.Wang
*
*/
public abstract class PizzaStore {
public Pizza orderPizza(String item) {
Pizza pizza;
pizza = createPizza(item);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String item);
}
代码:
/**
* @time 2014年5月26日
*/
package factory;
/**
* @author C.L.Wang
*
*/
public class NYPizzaStore extends PizzaStore {
/* (non-Javadoc)
* @see factory.PizzaStore#createPizza(java.lang.String)
*/
@Override
Pizza createPizza(String item) {
// TODO Auto-generated method stub
if (item.equals("cheese")) {
return new NYStyleCheesePizza();
} else return null;
}
}
/**
* @time 2014年5月26日
*/
package factory;
/**
* @author C.L.Wang
*
*/
public class ChicagoPizzaStore extends PizzaStore {
/* (non-Javadoc)
* @see factory.PizzaStore#createPizza(java.lang.String)
*/
@Override
Pizza createPizza(String item) {
// TODO Auto-generated method stub
if (item.equals("cheese")) {
return new ChicagoStyleCheesePizza();
} else return null;
}
}
代码:
/**
* @time 2014年5月26日
*/
package factory;
/**
* @author C.L.Wang
*
*/
public class PizzaTestDrive {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PizzaStore nyStore = new NYPizzaStore();
PizzaStore chicagoStore = new ChicagoPizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
pizza = chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
}
}
Preparing NY Style Sauce and Cheese Pizza Tossing dough...Thin Crust Dough Adding sauce...Marinara Sauce Adding toppings: Grated Reggiano Cheese Bake for 25 minutes at 350 Cutting the pizza into diagonal slices Place pizza in official PizzaStore box Ethan ordered a NY Style Sauce and Cheese Pizza Preparing Chicago Style Deep Dish Cheese Pizza Tossing dough...Extra Thick Crust Dough Adding sauce...Plum Tomato Sauce Adding toppings: Shredded Mozzarella Cheese Bake for 25 minutes at 350 Cutting the pizza into square slices Place pizza in official PizzaStore box Joel ordered a Chicago Style Deep Dish Cheese Pizza
依赖倒置原则: 要依赖抽象, 不要依赖详细类.
指导方针:
1. 变量不能够持有详细类的引用.
2. 不要让类派生自详细类.
3. 不要覆盖基类中已实现的方法.
版权声明:本文博主原创文章,博客,未经同意不得转载。
设计模式 - 出厂模式(factory pattern) 详细说明
原文:http://www.cnblogs.com/yxwkf/p/4841928.html