设计模式中的工厂模式分为简单工厂模式,工厂方法模式和抽象工厂模式三种,其中简单工厂模式应用最多。与单例模式一样,工厂模式也是创建型模式,不同的是单例模式是让别的类只创建一个该类的实例,工厂模式则是将创建对象实例代码封装到一个工厂类中,别的类创建对象时调用工厂类创建即可,提高了代码的可扩展性,遵守ocp原则。
下面以披萨店为应用场景,模拟实现简单工厂模式。
Pizza.java
public abstract class Pizza {
protected String name;
public void setName(String name) {
this.name = 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+"正在打包....");
}
}
CheesePizza.java
public class CheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println(name+"正在准备原料....");
}
}
Pepper.java
public class Pepper extends Pizza {
@Override
public void prepare() {
System.out.println(name+"正在准备原料....");
}
}
以上三个类为披萨种类。
SimpleFactory.java
public class SimpleFactory {
public Pizza createPizza(String orderType){
Pizza pizza = null;
if ("cheese".equals(orderType)){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}else if ("pepper".equals(orderType)){
pizza = new Pepper();
pizza.setName("胡椒披萨");
}else {
System.out.println("暂无此口味披萨上市!");
}
return pizza;
}
}
此类为简单工厂类,所有创建披萨对象实例的操作调用此类中的createPizza方法完成。
Order.java
public class Order {
SimpleFactory simpleFactory;
public static void main(String[] args) {
new Order(new SimpleFactory());
}
public Order(SimpleFactory simpleFactory){
String orderType = null;
this.simpleFactory= simpleFactory;
do{
orderType = getType();
Pizza pizza = simpleFactory.createPizza(orderType);
if (pizza != null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
break;
}
}while (true);
}
public String getType(){
BufferedReader br =null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入披萨种类:");
String s = br.readLine();
return s;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
Order类为出售披萨的店铺,并不“制造披萨”,SimpleFactory类中的createPizza方法制造披萨。
在使用简单工厂模式之后,当有了新的披萨种类时,只需添加新的披萨种类,修改简单工厂类中的一些代码即可,不用修改Order类中的代码,当有多个Order类,修改内容少,代码的可扩展性高,遵守ocp原则。