开始之前,先讲下java直接new一个对象
Pizza pizza = new CheesePizza(); ;
对象pizza使用了接口,是代码更具有弹性,但是CheesePizza还是建立了具体的类,当有一群具体的类,如:
- Pizza pizza = null;
- if (type.equals("cheese")) {
- pizza = new CheesePizza();
- } else if (type.equals("pepperoni")) {
- pizza = new PepperoniPizza();
- }
面向接口编程
面向接口编程,可以隔离掉以后系统可能发生的改变。如果代码使用具体的类,就要修改代码。也就是非“对修改关闭”。当要扩展时,就必须打开它。所以要回到OO设计原则,找到变化的方面,把它们从不变的部分分离出来。
一、简单工厂模式
PizzaStore.java
public class PizzaStore {
SimplePizzaFactory factory;//多用组合,少用继承
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();//面向接口编程
pizza.cut();
pizza.box();
return pizza;
}
}
SimplePizzaFactory.java
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("pepperoni")) {
pizza = new PepperoniPizza();
}
return pizza;
}
}
Pizza.java
import java.util.ArrayList;
abstract public class Pizza {
String name;
String dough;
String sauce;
ArrayList toppings = new ArrayList();
public String getName() {
return name;
}
public void prepare() {
System.out.println("Preparing " + name);
}
public void bake() {
System.out.println("Baking " + name);
}
public void cut() {
System.out.println("Cutting " + name);
}
public void box() {
System.out.println("Boxing " + name);
}
public String toString() {
// code to display pizza name and ingredients
StringBuffer display = new StringBuffer();
display.append("---- " + name + " ----\n");
display.append(dough + "\n");
display.append(sauce + "\n");
for (int i = 0; i < toppings.size(); i++) {
display.append((String )toppings.get(i) + "\n");
}
return display.toString();
}
}
CheesePizza.java
- public class CheesePizza extends Pizza {
- public CheesePizza() {
- name = "Cheese Pizza";
- dough = "Regular Crust";
- sauce = "Marinara Pizza Sauce";
- toppings.add("Fresh Mozzarella");
- toppings.add("Parmesan");
- }
- }
PepperoniPizza.java
- public class PepperoniPizza extends Pizza {
- public PepperoniPizza() {
- name = "Pepperoni Pizza";
- dough = "Crust";
- sauce = "Marinara sauce";
- toppings.add("Sliced Pepperoni");
- toppings.add("Sliced Onion");
- toppings.add("Grated parmesan cheese");
- }
- }
PizzaTestDrive.java
- public class PizzaTestDrive {
- public static void main(String[] args) {
- SimplePizzaFactory factory = new SimplePizzaFactory();
- PizzaStore store = new PizzaStore(factory);
- Pizza pizza = store.orderPizza("cheese");
- System.out.println("We ordered a " + pizza.getName() + "\n");
- pizza = store.orderPizza("pepperoni");
- System.out.println("We ordered a " + pizza.getName() + "\n");
- }
- }
二、结果如下:
三、原来creatPizza的位置代码如下:
- if (type.equals("cheese")) {
- pizza = new CheesePizza();
- } else if (type.equals("pepperoni")) {
- pizza = new PepperoniPizza();
- } else if (type.equals("clam")) {
- pizza = new ClamPizza();
- } else if (type.equals("veggie")) {
- pizza = new VeggiePizza();
- }
- return pizza;
因为此部分是变化的,简单工厂模式封装了变化。实现了松耦合。