工厂方法模式: 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类.
包括:
创建者父类(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; } }
2. 具体产品类(concrete product), 具体产品的定制方法.
代码:
/** * @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"); } }
3. 创建者父类(creator), 具体的使用方法, 调用产品类父类(product)的方法, 提供根据参数创建不同具体产品类(concrete product).
代码:
/** * @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); }
4. 具体创建者(concrete creator), 通过参数创建不同的具体产品(concrete product).
代码:
/** * @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; } }
本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/
5. 测试, 创建不同的具体创建者(concrete creator), 即工厂, 通过调用函数的参数, 选择不同的产品进行使用.
代码:
/** * @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"); } }
6. 输出:
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. 不要覆盖基类中已实现的方法.
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 方法
, creator
, 基本
, 装饰模式详解
, println
创建者
factory工厂模式、海信电视工厂模式详解、ios 工厂模式详解、java 工厂模式详解、安卓工厂模式详解,以便于您获取更多的相关知识。