1. 简单工厂模式简介
工厂模式是非常用的创建型模式(Creational Pattern)设计模式,通常我们说的工厂模式,就是指工厂方法模式(Factory Method Pattern)。本文要说的简单工厂模式,是工厂方法模式的简化版,不是GoF所写的23个设计模式。理解简单工厂模式,有助于我们理解工厂方法模式和抽象工厂模式。
简单工厂模式(Simple Factory Pattern)就是定义一个工厂类,它可以通过不同的输入参数返回不同类型的实例;这些实例通常有着共同的父类。简单工厂模式有三种角色。
工厂角色(Factory):工厂角色,即工厂类,负责创建所有产品的实例,是简单工厂模式的核心。
抽象产品角色(Product):是工厂创建的实例对象的父类,封装了产品对象的公有方法;换言之,工厂类创建的对象,都是这个抽象产品类的子类对象。
具体产品角色(Concrete Product):是工厂创建的目标,也是抽象产品类的子类。
2.简单工厂代码实例
下面我们将演示一个简单工厂的例子,这是图形工厂,生产各种图形。
工厂类 ShapeFactory
/**
* 工厂类,生产图形的工厂。
*/
public class ShapeFactory {
// 静态工厂,根据输入类型,获取对应的产品
public static Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){ // 圆形
return new Circle();
} else if(shapeType.equalsIgnoreCase("Triangle")){ // 三角形
return new Triangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){ // 正方形
return new Square();
}
return null;
}
}
抽象产品类 Shape
/**
* 抽象产品类,图形类
*/
public interface Shape {
void draw();
}
具体产品类
第一个具体产品,圆形。
/**
* 具体产品类,圆形
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("圆形");
}
}
第二个具体产品,正方形。
/**
* 具体产品类,正方形
*/
public class Square implements Shape{
@Override
public void draw(){
System.out.println("正方形");
}
}
第三个具体产品,三角形。
/**
* 具体产品类,三角形
*/
public class Triangle implements Shape{
@Override
public void draw() {
System.out.println("三角形");
}
}
调用示例
SimpleMethodMain是一个客户端,只需要向工厂类提出要创建什么类型的Shape就行了,不用关心创建对象的逻辑。如果想要创建其它类型的Shape,只需改变参数即可。
public class SimpleMethodMain {
public static void main(String[] args) {
Shape shape = ShapeFactory.getShape("circle");
shape.draw();
}
}
输出:圆形
3.总结
简单工厂模式的优点是使用了工厂类来创建对象,隔离了对象的创建和使用;客户端也不需要知道具体产品的类名,只需要知道参数即可。
简单工厂模式的缺点是工厂类的角色太重了;同时扩展性不好,静态方法不能被子类继承和覆盖,并且如果需要更多的产品,例如需要更多的图形,就需要修改getShape方法,违法开闭原则。
(完)