首先来看一个具体需求来引出主题。
这是一个披萨店的项目:要便于披萨种类的扩展,更要便于维护。具体需求如下:
从上述需求可以看出我们需要定义了一个抽象类(因为披萨的方法有不同的实现,也有相同的部分)来实现更好的扩展,然后再让一个PizzaShop依赖所有不同种类的披萨,因此我们首先要定义一个Pizza基类(抽象类):
package factory.simpleFactory.pizzas;
public abstract class Pizza {
private String name;
public abstract void prepare();
public void bake(){
System.out.println("正在做"+name+"披萨");
}
public void cut(){
System.out.println("正在切"+name+"披萨");
}
public void box(){
System.out.println("正在包装"+name+"披萨");
}
public void setName(String name){
this.name = name;
}
}
之后我们可以让子类继承该基类来实现扩展,例如牛肉披萨类:
public class BeefPizza extends Pizza {
@Override
public void prepare() {
System.out.println("给牛肉披萨准备原材料");
}
}
当然,也可以派生出苹果披萨,猪肉披萨等,每当披萨店有新品上市,理论上我们都只需要继承Pizza再实现扩展即可。
之后我们便可以在PizzaShop中来卖披萨了。
public class PizzaShop1 {
public PizzaShop1(){
Pizza pizza = null;
do{
String pizzaType = getType();
if(pizzaType.equals("beef")){
pizza = new BeefPizza();
pizza.setName("牛肉比萨");
}else if(pizzaType.equals("apple")){
pizza = new ApplePizza();
pizza.setName("苹果比萨");
}else {
System.out.println("对不起,没有该类披萨");
break;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);
}
public String getType(){
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入您想要点的披萨品种");
String pizzaName = bufferedReader.readLine();
return pizzaName;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
之后便再main方法中运行一下,可以看到:
public class OrderPizza {
public static void main(String[] args) {
new PizzaShop1();
System.out.println("点餐结束");
}
}
看似功能很完善,然而我们这里却有个大问题,我们知道披萨店往往都有分店,而所有不同的分店都要依赖Pizza,而每个PizzaShop的构造方法中都在做实例化对象的事情,因此我们一旦要新增一个Pizza品种,就要去修改每一个PizzaShop的构造方法,这样显然是违背了ocp法则的,故而我们应当想办法去客服这个问题,这时候简单工厂模式就有其用武之地了,它的大体思想就是我们只需要封装一个创建Pizza对象的类,这样当我们有新的Pizza类的时候只需要修改该类即可。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
public class SimpleFactory {
public Pizza createPizza(String pizzaType){
Pizza pizza = null;
if (pizzaType.equals("beef")) {
pizza = new BeefPizza();
pizza.setName("牛肉比萨");
} else if (pizzaType.equals("apple")) {
pizza = new ApplePizza();
pizza.setName("苹果比萨");
}
return pizza;
}
}
修改商品类
public class PizzaShop1 {
public PizzaShop1(){
do{
Pizza pizza = null;
String pizzaType = getType();
if (pizzaType.equals("beef")) {
pizza = new BeefPizza();
pizza.setName("牛肉比萨");
} else if (pizzaType.equals("apple")) {
pizza = new ApplePizza();
pizza.setName("苹果比萨");
} else {
System.out.println("对不起,没有该类披萨");
break;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);
}
private SimpleFactory simpleFactory;
Pizza pizza = null;
public PizzaShop1(SimpleFactory simpleFactory){
this.simpleFactory = simpleFactory;
String orderType = "";//用户的输入
do{
orderType = getType();
pizza=this.simpleFactory.createPizza(orderType);
if(pizza!=null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购失败");
break;
}
}while (true);
}
public String getType(){
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入您想要点的披萨品种");
String pizzaName = bufferedReader.readLine();
return pizzaName;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}