Patrón de método de fábrica
Primero veamos un requisito: cuando los clientes piden pizza, pueden pedir diferentes sabores de pizza, como pizza de queso Henan, pizza de pimiento de Henan o pizza de queso de Londres, pizza de pimiento de Londres.
Ideas
Idea 1 : Use el patrón de fábrica simple para crear diferentes clases de fábrica simples , como HNPizzaSimpleFactory,
LDPizzaSimpleFactory, etc. Desde el caso actual, también es posible, pero considerando la escala del proyecto, así como la mantenibilidad y escalabilidad del software No es particularmente bueno
Idea 2 : usa el patrón del método de fábrica
Introducción al patrón del método de fábrica
Esquema de diseño de patrón de método de fábrica : abstraiga la función de instanciación del proyecto de pizza en un método abstracto e impleméntelo en diferentes subclases de orden de sabor.
Patrón de método de fábrica : define un método abstracto para crear un objeto, y la subclase determina la clase a instanciar . El patrón del método de fábrica difiere la instanciación de objetos a subclases.
Diagrama de clase
Nuestro modelo de fábrica simple es crear instancias de objetos directamente en la fábrica , y el modelo de método de fábrica es dar la autoridad para crear objetos a sus subclases , HNOrderPizz (Henan Pizza) y LNOrderPizza (London Pizza)
Código
Entidad pizza
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:06
* @Description TODO
* @pojectname 披萨抽象类 设置为抽象类
*/
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;
}
}
4 subcategorías de pizza de Henan y pizza de Londres
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:47
* @Description TODO
* @pojectname 河南奶酪代码
*/
public class HNCheesePizza extends Pizza{
@Override
public void prepare() {
setName("河南的奶酪披萨");
System.out.println("给河南奶酪披萨准备原材料");
}
}
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:49
* @Description TODO
* @pojectname 河南胡椒代码
*/
public class HNPepperPizza extends Pizza {
@Override
public void prepare() {
setName("河南的胡椒披萨");
System.out.println("给河南胡椒披萨准备原材料");
}
}
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:47
* @Description TODO
* @pojectname 伦敦奶酪代码
*/
public class LDCheesePizza extends Pizza{
@Override
public void prepare() {
setName("伦敦的奶酪披萨");
System.out.println("给伦敦奶酪披萨准备原材料");
}
}
伦敦胡椒披萨也如此
OrderPizza código de pedido
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:14
* @Description TODO
* @pojectname 订购披萨代码
*/
public abstract class OrderPizza {
//定义一个抽象方法createPizza,让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);
//构造器
public OrderPizza(){
Pizza pizza = null;
String orderType ;//orderType用户输入pizza类型
do {
orderType = getType();//获取用户订购的pizza类型
System.out.println(orderType);
pizza = createPizza(orderType);//抽象方法,实际上又工厂子类完成
//输出制作pizza信息
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while(true);
}
//获取客户订购的披萨种类
private String getType(){
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
Dos subclases de OrderPizza
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:56
* @Description TODO
* @pojectname 河南披萨订单代码
*/
public class HNOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new HNCheesePizza();
}else if (orderType.equals("pepper")){
pizza = new HNPepperPizza();
}
return pizza;
}
}
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:56
* @Description TODO
* @pojectname 伦敦披萨代码
*/
public class LDOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new LDCheesePizza();
}else if (orderType.equals("pepper")){
pizza = new LDPepperPizza();
}
return pizza;
}
}
public class PizzaStore {
public static void main(String[] args) {
//创建河南口味的各种方法
new HNOrderPizza();
}
}
根据我们new的种类,我们就能得到不同的结果
input pizza 种类:
cheese
cheese
给河南奶酪披萨准备原材料
河南的奶酪披萨baking;
河南的奶酪披萨cutting;
河南的奶酪披萨boxing
input pizza 种类:
pepper
那我们要是 new LDOrderPizza();
那么输出的都是有关伦敦披萨的口味
para resumir
Resumamos de nuevo en nuestra. Sencillo modelo de fábrica, nuestra idea es que deje directamente a nuestra clase para OrderPizza , de acuerdo a los diferentes gustos OrderType, a nuevo un sabor diferente de la pizza , y nuestro modelo de fábrica método es como esto : En nuestro modelo de fábrica de método, nuestra clase de pedido OrderPizza está escrita como una clase abstracta con el método abstracto createPiiza () . Este método abstracto se utiliza para crear objetos de instancia de pizza, pero es un método abstracto , por lo que nuestro pedido de pizza Henan y los pedidos de pizza de Londres deben heredar la clase principal OrderPizza . Es decir , distribuimos la tarea de crear objetos de instancia a diferentes subclases . Las subclases son originalmente diferentes, y naturalmente pueden hacer pizzas de diferentes lugares, y luego después de que las subclases crean diferentes sabores de pizza en diferentes lugares, volver a nuestra clase principal OrderPizza , y luego nuestra clase principal genera la información correspondiente