工厂模式
定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。
说明:
- 所有的工厂模式都是用来封装对象的创建。工厂模式通过让子来决定应该创建的对象是什么,以达到将对象创建的过程封装的目的。
- 编写创建者时,不需要知道实际创建的产品是哪一个,选择了使用哪个子类,而是由子类去实例化。
个人总结
- 其实可以简单这样理解:工厂的核心就是创建对象的一个方法。
- 通过工厂返回的对象,调用对象的方法。
- 在工厂子类中去创建实例对象,即在子类中写义务逻辑
- 考虑到多态,将产品写成抽象方法,让子类去实现他,工厂创建的也是具体的子类。
- 对主函数而言,不需要指定实例化创建的产品是谁,而是通过调用工厂的创建子类方法。
其他总结
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事
具体实例
抽象工厂:
public abstract class PizzaStore {
//抽象方法:得到一个具体的Produce对象
public abstract Pizza getPizza(String type);
//提供一个购买pizza的方法
public void orderPizza(String type) {
Pizza pizza = getPizza(type);
pizza.prepare();//准备pizza
pizza.bake();//烤pizza
pizza.cut();//切pizza
pizza.box();//打包
}
}
具体工厂:
public class PizzaStoreA extends PizzaStore{
//实现父类抽象方法,返回具体实例
@Override
public Pizza getPizza(String type) {
// TODO Auto-generated method stub
if (type.equals("egg")) {
return new EggPizza();
}else {
return new FriutPizza();
}
}
}
父类对象
public abstract class Pizza {
String name;
String sauce; //佐料
ArrayList<String> list = new ArrayList<String>();
public void prepare(){
System.out.println("name "+name);
System.out.println("sauce "+sauce);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i)+" in pizza");
}
}
public void bake(){
System.out.println("baking");
}
public void cut(){
System.out.println("pizza is cuting");
}
public void box(){
System.out.println("pizza in box");
}
具体实例对象:EggPizza
public class EggPizza extends Pizza{
public EggPizza() {
// TODO Auto-generated constructor stub
name = "EggPizza";
sauce = "Egg";
list.add("Egg");
}
//可以重新父类方法
}
具体实例对象:FriutPizza
public class FriutPizza extends Pizza{
public FriutPizza() {
// TODO Auto-generated constructor stub
name = "FriutPizza";
sauce = "Friut";
list.add("Friut");
}
}
测试类:
public class MainTest {
public static void main(String[] args) {
PizzaStore pizzaStore = new PizzaStoreA();
pizzaStore.orderPizza("egg");
pizzaStore.orderPizza("other");
}
}
运行结果
name: EggPizza
sauce: Egg
Egg in pizza
baking
pizza is cuting
pizza in box
name: FriutPizza
sauce: Friut
Friut in pizza
baking
pizza is cuting
pizza in box