设计模式起点之简单工厂模式

前言

简单工厂模式并不是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版) 刘伟 编著 清华大学出版社

猜你喜欢

转载自blog.csdn.net/weixin_43594279/article/details/114919377
今日推荐