工厂模式
工厂模式一般分为简单工厂模式和工厂方法模式
-
简单工厂模式
简单工厂模式其实不是一个设计模式,反而比较像一种编程习惯。主要我们定义一个非常简单的类主要负责帮我们生产不同的产品。类图如下:
客户端通过简单工厂可以生产出具体产品A,具体产品B,具体产品C。
简单工厂:
package my.oschina.net.design.factory;
public class SimplePizzaFactory {
/**
* 根据传入的type参数,返回相应的pizza
* @param type
* @return
*/
public Pizza createPizza(String type) { //一般这个方法为static
Pizza pizza = null;
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;
}
}
客户端,想要建立一个pizza store,这个pizza store里有一个简单工厂,当我们需要什么pizza的时候,告诉简单工厂,它会为我们生产
package my.oschina.net.design.factory;
public class PizzaStore {
//通过组合的使用,加上一个简单工厂SimplePizzaFactory的引用,用于创建pizza
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
//调用简单工厂SimplePizzaFactory的createPizza(type)方法创建pizza
pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
-
工厂方法模式
这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂。
构建一个工厂的时候,实际上是构建一个具体的子类对象,让子类决定去生产什么产品。
构建两个工厂,一个芝加哥pizza工厂,一个纽约pizza工厂。去生产芝加哥风味的pizza以及纽约风味的pizza。
package my.oschina.net.design.factory;
public class ChicagoPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new ChicagoStyleCheesePizza();
} else if (item.equals("veggie")) {
return new ChicagoStyleVeggiePizza();
} else if (item.equals("clam")) {
return new ChicagoStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new ChicagoStylePepperoniPizza();
} else return null;
}
}
package my.oschina.net.design.factory;
public class NYPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new NYStyleCheesePizza();
} else if (item.equals("veggie")) {
return new NYStyleVeggiePizza();
} else if (item.equals("clam")) {
return new NYStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new NYStylePepperoniPizza();
} else return null;
}
}
客户端:
package my.oschina.net.design.factory;
public class PizzaTestDrive {
public static void main(String[] args) {
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");
pizza = nyStore.orderPizza("clam");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
pizza = chicagoStore.orderPizza("clam");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
}
}