什么是工厂设计模式
工厂模式是平时开发过程中最常见的设计模式。工厂模式解决类的实例化问题,它属于创建型模式。
试想你去披萨店买一个披萨。你只需要告诉老板要一个xx披萨。过一会就会有一个此类型的披萨被制作出来。而你完全不需要知道这个披萨是怎么被制作出来的。这个例子中你就是客户端代码,披萨店就是工厂,负责生产披萨。披萨是接口,而具体的某一种汉堡,比如说香辣披萨,就是实现了汉堡接口的类。
接下来以代码来演示一下吧
创建一个Pizza抽象类,因为我们要制作不同的披萨
package factory;
/**
* @author 邓亚非
* 抽象pizza类,制作各种披萨流程
*/
public abstract class Pizza {
protected String name;
/**
* 准备原材料方法
*/
public abstract void prepare();
/**
* 烘烤披萨方法
*/
public void bake() {
System.out.println(name + " baking;");
}
/**
* 披萨切块方法
*/
public void cut() {
System.out.println(name + " cutting;");
}
//打包方法
public void box() {
System.out.println(name + " boxing;");
}
public void setName(String name) {
this.name = name;
}
public String getName(){
return this.name;
}
}
创建了具体pizza类A和B分别继承pizza抽象类
Pizza
重写一个准备原材料的方法,因为不同的披萨肯定原材料不同,所以这个方法选择重写,其他的步骤都一致就没必要重写了
package factory;
/**
* @author 邓亚非
* pizzaA具体的披萨
*/
public class PizzaA extends Pizza{
@Override
public void prepare() {
System.out.println("准备PizzaA的原材料");
}
}
PizzaB
package factory;
/**
* @author 邓亚非
* pizzaB具体的pizza
*/
public class PizzaB extends Pizza{
@Override
public void prepare() {
System.out.println("准备PizzaB原材料");
}
}
创建一个Factory工厂类,用来生产披萨
package factory;
/**
* @author 邓亚非
* 工厂类:制作指定的披萨
*/
public class Factory {
/**
*
* @param pizzaType
* @return 根据输入的pizza类型返回具体的披萨对象交给订单类
*/
public Pizza makePizza(String pizzaType){
Pizza pizza=null;
if (pizzaType==null){
throw new RuntimeException("告诉我们你要什么披萨我们才能制作哦");
}
if (pizzaType.equals("PizzaA")){
pizza=new PizzaA();
pizza.setName("PizzaA");
return pizza;
}else if (pizzaType.equals("PizzaB")){
pizza=new PizzaB();
pizza.setName("PizzaB");
}else {
throw new RuntimeException("目前没有引进这个"+pizzaType+"的原材料");
}
return pizza;
}
}
创建OrderPizza订单类
package factory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author 邓亚非
* 披萨订单类
*/
public class OrderPizza {
protected String orderName;
private Factory factory;
private Pizza pizza=null;
/**
* 为了方便测试,初始化的时候就加载工厂
*/
public OrderPizza(Factory factory){
setFactory(factory);
}
/**
* 传入过程类调用工厂类生产pizza的方法,再去进行一系列的生产,形成一个订单
* @param factory
*/
public void setFactory(Factory factory){
this.factory=factory;
if (factory!=null){
pizza=factory.makePizza(this.getPizzaType());
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
throw new RuntimeException("请交给pizza师父去做哦");
}
}
/**
* 因为只有在订单这里才能知道客户要什么样的披萨,所以我们创建一个用户需求方法返回用户需求披萨类型
* 传给过程类调用的制作pizza方法,让她知道制作什么样的披萨
* @return
*/
public String getPizzaType(){
BufferedReader bufferedReader=null;
System.out.println("小姐姐你好,请问你需要什么样的披萨?");
try {
bufferedReader= new BufferedReader(new InputStreamReader(System.in));
String pizzaType=bufferedReader.readLine();
return pizzaType;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
创建PizzaStore类,卖给客户用的类,
package factory;
/**
* @author 邓亚非
* 披萨店类:卖给客户
*/
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new Factory());
}
}
最后看看输出
补充:设计模式是非常重要,因为它能帮助我们看懂一些框架的原理,比如说工厂模式spring框架里面生成bean就用到了工厂模式,所以说好好好学