前言
简单工厂模式并不是GoF 23个设计模式中的一员,但是一般将其作为学习设计模式的起点。在简单工厂模式中,可以根据参数的不同返回不同的类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,这个类称为工厂类,被创建的实例通常都具有共同的父类。
一、简单工厂模式
简单工厂模式(Simple Factory Pattern)又称为静态工厂方法模式(Static Factory Method Pattern),属于类创建型模式。
定义:定义一个类,根据参数的不同返回不同的类实例,这些类具有公共的父类和一些公共的方法。简单工厂模式不属于GoF设计模式,它是最简单的工厂模式。
使用频率:4星
简单工厂模式结构图:
优点:
1、工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
2、客户端无需知道所创建具体产品的类名,只需知道参数即可。
3、也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
缺点:
1、简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
2、使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
3、系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
4、简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。
应用场景:
对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
二、简单工厂模式实例之图形工厂
1.实例说明
使用简单工厂模式设计一个可以创建不同几何形状(Shape)的绘图工具类,如可创建圆形(Circle)、矩形(Rectangle)和三角形(Triangle)对象,每个几何图形均具有绘制draw和擦除erase两个方法,要求在绘制不支持的几何图形时抛出UnsupportedShapeException异常,绘制类图并编程实现。
2.实例类图
3.实例代码
在本例中,Shape充当抽象产品,其子类Circle、Rectangle和Triangle等充当具体产品,ShapeFactory为工厂类。
//形状接口:抽象产品
interface Shape
{
public void draw();
public void erase();
}
//圆形类:具体产品
class Circle implements Shape
{
public void draw()
{
System.out.println("绘制圆形");
}
public void earse()
{
System.out.println("删除圆形");
}
}
//矩形类:具体产品
class Rectangle implements Shape
{
public void draw()
{
System.out.println("绘制矩形");
}
public void earse()
{
System.out.println("删除矩形");
}
}
//三角形类:具体产品
class Triangle implements Shape
{
public void draw()
{
System.out.println("绘制三角形");
}
public void earse()
{
System.out.println("删除三角形");
}
}
//形状工厂类:工厂
class ShapeFactory
{
//静态工厂方法
public static Shape createShape(String type)throws UnsupportedShapeException
{
if(type.equalsIgnoreCase("c")
{
return new Circle();
}
else if(type.equalsIgnoreCase("r")
{
return new Rectangle();
}
else if(type.equalsIgnoreCase("t")
{
return new Triangle();
}
else
{
throw new UnsupportedShapeException("不支持该形状!");
}
}
}
//自定义异常类
class UnsupportedShapeException extends Exception
{
public UnsupportedShapeException(String message)
{
super(message);
}
}
客户端测试类代码:
class Client
{
public static vodi main(String[] args)
{
try
{
Shape shape;
shape = ShapeFactory.createShape("r");
shape.draw();
shape.erase();
}
catch(UnsupportedShapeException e)
{
System.out.println(e.getMessage());
}
}
}
运行结果如下:
绘制矩形
删除矩形
参考文献
【1】简单工厂模式
【2】设计模式实训教程(第2版) 刘伟 编著 清华大学出版社