简单工厂
定义:
定义了一个创建对象的类,由这个类来封装实例化对象的行为。
用接下来的代码来解释
代码实现
不论是什么披萨(Pizza )都得经过 准备材料 烤 切 打包等步骤
将这些行为单独抽出来 作为抽象方法
不同类型的pizza 都可能有自己独有的东西,但又都是pizza
/**
Pizza 对象
* @author Myli
* @create 2023-03-08 15:03
*/
public abstract class Pizza {
//公共的业务方法
//准备材料
public void prepare(){
System.out.println("prepare");
};
//烤
public void bake(){
System.out.println("bake");
};
//切
public void cut(){
System.out.println("cut");
};
//打包
public void box(){
System.out.println("box");
};
}
/**具体抽象产品类 胡椒披萨 必须有一些自己的东西比如胡椒准备*/
public class PepperPizza extends Pizza{
//实现业务方法
}
/**具体抽象产品类 希腊比萨 必须有一些自己的东西比如…准备*/
public class GreekPizza extends Pizza{
//实现业务方法
}
/** 具体抽象产品类 奶酪披萨 必须有一些自己的东西比如奶酪准备 */
public class CheesePizza extends Pizza {
//实现业务方法
}
//工厂类 进行代加工
public class SimplePizzaFactory {
public Pizza CreatePizza(String ordertype) {
Pizza pizza = null;//
if (ordertype.equals("cheese")) {
pizza = new CheesePizza();
} else if (ordertype.equals("greek")) {
pizza = new GreekPizza();
} else if (ordertype.equals("pepper")) {
pizza = new PepperPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
当我们创建这个pepperPizza,他的所有工作(准备,烤 切 打包 自己独有的等)都做完了
//具体使用,或者在其他地方用这个东西
public class SimpleFactoryTest {
public static void main(String[] args) {
SimplePizzaFactory simplePizzaFactory = new SimplePizzaFactory();
//当我们创建这个pepperPizza时,他的自己的独有的和披萨和共有的工作就已经做好了
Pizza pepper= simplePizzaFactory.CreatePizza("pepper");
}
}
缺点:
类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所以,从设计角度考虑,有一定的问题,如何解决?(举文中的例子,你创建Pizza,必须得经过SimplePizzaFactory,如果想做新的类型的pizza,比如芒果pizza,你不仅得写一个继承pizza的芒果pizza类外,你还得修改SimplePizzaFactory,把你新写的加到elseif中 )
结论:
我们可以定义一个创建对象的抽象方法并创建多个不同的工厂类实现该抽象方法,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
这种方法也就是我们接下来要说的工厂方法模式。