Factory Method(工厂方法)
一、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
二、结构
工厂方法模式的结构如图7.27所示。
其中:
• Product定义工厂方法所创建的对象的接口。
• ConcreteProduct 实现 Product 接口。
• Creator声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个 工厂方法的默认实现,它返回一个默认的ConcretePioduct对象,可以调用工厂方法以创建一个Product对象。
• ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例。
三、适用性
Factory Method 模式适用 :
• 当一个类不知道它所必须创建的对象的类的时候。
• 当一个类希望由它的子类来指定它所创建的对象的时候。
• 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
四、实现
我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。
首先 创建一个接口:
。
interface Shape {
void draw();
}
然后 创建实现接口的实体类
。
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("矩形被画出来了");
}
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("正方形被画出来了");
}
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("圆被画出来了");
}
}
其次 创建一个工厂,生成基于给定信息的实体类的对象
。
class ShapeFactory {
//使用 getShape 方法获取形状类型的对象
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
最后 使用该工厂,通过传递类型信息来获取实体类的对象
。
public class FactoryMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法
shape3.draw();
}
}
运行结果:
五、小结
一、一句话概括工厂模式
简单工厂:一个工厂类,一个产品抽象类。
工厂方法:多个工厂类,一个产品抽象类。
抽象工厂:多个工厂类,多个产品抽象类。
二、生活中的工厂模式
简单工厂类:一个麦当劳店,可以生产多种汉堡。
工厂方法类:一个麦当劳店,可以生产多种汉堡。一个肯德基店,也可以生产多种汉堡。
抽象工厂类:百胜餐饮集团下有肯德基和百事公司,肯德基生产汉堡,百事公司生成百事可乐。