一、说明/设计原则
- 1、说明:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。
二、实例
2-1、简单版本
步骤1、创建实体类
package com.tjw.headFirst.four.classes;
import java.util.ArrayList;
/**
* @program: HeadFirst
* @description:
* @author: jiawen.tang
**/
public abstract class Pizza {
String name;
String dough;// 面团类型
String sauce;// 酱料类型
ArrayList toppings = new ArrayList();
public void prepare(){
System.out.println("原始pizza准备");
}
public void bake(){
System.out.println("原始pizza准备烤");
}
public void cut(){
System.out.println("原始pizza准备切割");
}
public void box(){
System.out.println("原始pizza准备装箱");
}
}
package com.tjw.headFirst.four.classes;
/**
* @program: HeadFirst
* @description:芝士pizza
* @author: jiawen.tang
**/
public class CheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("che-pizza准备");
}
@Override
public void bake() {
System.out.println("che-pizza准备烤");
}
@Override
public void cut() {
System.out.println("che-pizza准备切");
}
@Override
public void box() {
System.out.println("che-pizza准备装箱");
}
}
package com.tjw.headFirst.four.classes;
/**
* @program: HeadFirst
* @description:蔬菜披萨
* @author: jiawen.tang
**/
public class VegetablesPizza extends Pizza {
@Override
public void prepare() {
System.out.println("veg-pizza准备");
}
@Override
public void bake() {
System.out.println("veg-pizza准备烤");
}
@Override
public void cut() {
System.out.println("veg-pizza准备切");
}
@Override
public void box() {
System.out.println("veg-pizza准备装箱");
}
}
步骤2、创建工厂
package com.tjw.headFirst.four;
import com.tjw.headFirst.four.classes.CheesePizza;
import com.tjw.headFirst.four.classes.Pizza;
import com.tjw.headFirst.four.classes.VegetablesPizza;
/**
* @program: HeadFirst
* @description:简单工厂方法
* @author: jiawen.tang
**/
public class SimplePizzaFactory {
/**
* 通过参数来区分需要创建什么对象
* @param type
* @return
*/
public Pizza createPizza(String type){
Pizza pizza = null;
if (type.equals("veg")){
pizza = new VegetablesPizza();
} else if (type.equals("chee")){
pizza = new CheesePizza();
}
return pizza;
}
}
2-2、优化(可以自定义的)版本的工厂方法
步骤1、新加一个实体类
package com.tjw.headFirst.four.classes;
/**
* @program: HeadFirst
* @description:
* @author: jiawen.tang
**/
public class MyCheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("我的che-pizza准备");
}
@Override
public void bake() {
System.out.println("我的che-pizza准备烤");
}
@Override
public void cut() {
System.out.println("我的che-pizza准备切");
}
@Override
public void box() {
System.out.println("我的che-pizza准备装箱");
}
}
步骤2、可以自定义的方式
package com.tjw.headFirst.four;
import com.tjw.headFirst.four.classes.Pizza;
/**
* @program: HeadFirst
* @description:包装一些已经知道会操作的方法
* 其实这里最主要的是创建pizza的方法被抽象出来了,然后子类可以继承实现,比较自由
* @author: jiawen.tang
**/
public abstract class PizzaStore_optimize {
/**
* 一个披萨订单的方法A,一个创建披萨的抽象方法B,A里面调B,具体在子类调,然后调用具体的披萨的执行方法。
* @param type
* @return
*/
public Pizza orderPizza(String type){
Pizza pizza;
pizza = createPizza(type);
pizza.bake();
pizza.box();
return pizza;
}
/**
* 1-工程方法时抽象的
* 2-工厂方法必须返回一个产品,通常是一个父类火者1一个接口
* 3-根据参数创建具体的对象
*/
abstract Pizza createPizza(String type);
}
package com.tjw.headFirst.four;
import com.tjw.headFirst.four.classes.MyCheesePizza;
import com.tjw.headFirst.four.classes.Pizza;
/**
* @program: HeadFirst
* @description:这里的工程可以自己随时定义,添加一些新的工程都是可以的
* @author: jiawen.tang
**/
public class MyStyplePizzaStore extends PizzaStore_optimize {
@Override
Pizza createPizza(String type) {
// 自己决定制造什么样的披萨
if (type.equals("che")) {
return new MyCheesePizza();
} else {
return null;
}
}
}
三、总结
* 1、可以自定医德工厂方式明显更加自由一些,满足了新加一个pizza类的扩展,是一种很好的思想,重点在于那个创建工程的方法被父类抽象出来了。
参考资料 Java设计模式