简单工厂模式又称静态工厂方法模式,属于类创建型模式。
那么,我们为什么要学习简单工厂模式呢?经常学习开发的宝子们都知道,在实际的软件开发过程中,有时需要创建一些来自于相同父类的类的实例,为了代码的简洁,我们可以专门定义一个类来负责创建这些类的实例,所以这些被创建的实例具有共同的父类。因此我们习惯上的将创建其他类的实例的方法定义成为static方法,这样外部不需要实例化这个类就可以直接调用该方法来获得需要的对象,因此该方法也称为静态工厂方法。
在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义了一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简言之就是更好的阐述了面向对象语言中的继承和多态的机制。
简单工厂模式的结构比较简单,其核心是工厂类。
简单工厂模式包含以下角色:
1.工厂角色
工厂角色即工厂类,是该模式的核心负责实现创建所有实例的内部逻辑。
2.抽象产品角色
抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口。
3.具体产品角色
具体产品角色是简单工厂模式的创建目标。
在我们了解完简单工厂模式的基本思想和元素后,突然领导给了我们一个业务需求,让我们写一个绘图工具类,并方便后期的维护和升级,具体业务如下:
领导:鱼汤,我这边现在需要你写一个可以创建不同几何形状的绘图工具类,如可创建圆形、矩形三角形对象,每个几何图形均具有draw()和擦除erase()两种方法。在绘制不支持的几何图形时,抛出一个UnsupportedShapeException。
那么我们通过了解了简单工厂模式,就思考一下用简单工厂模式来解决这个问题吧!我们就拿圆形,矩形,三角形来进行实例来进行分析。根据上面的角色分类可以有以下分类
工厂角色:DrawFactory
抽象产品角色:Shape
具体产品角色:circle,rectangle,triangle
类图设计如下:
通过图中我们也可以明确的看出具体产品类接入抽象产品类,然后工厂类来进行加工创建
Shape类代码如下:
public interface Shape {
public void draw();
public void erase();
}
circle,rectangle,triangle类代码如下:
public class circle implements Shape{
public void draw(){
System.out.println("The circle has been drawn");
}
public void erase(){
System.out.println("The circle has been erase");
}
}
public class rectangle implements Shape{
public void draw(){
System.out.println("The rectangle has been draw");
}
public void erase(){
System.out.println("The rectangle has been erase");
}
}
public class triangle implements Shape{
public void draw(){
System.out.println("The triangle has been draw");
}
public void erase(){
System.out.println("The triangle has been erase");
}
}
DrawFactory类代码如下:
public class DrawFactory {
public static Shape drawPic(String Pic) throws Exception {
if (Pic.equalsIgnoreCase("circle")) {
System.out.println("The circle drawing tool has been created");
return new circle();
} else if (Pic.equalsIgnoreCase("rectangle")) {
System.out.println("The rectangle drawing tool has been created");
return new rectangle();
} else if (Pic.equalsIgnoreCase("triangle")) {
System.out.println("The triangle drawing tool has been created");
return new triangle();
} else {
throw new UnSupportedShapeException("UnsupportedShapeException");
}
}
}
UnSupportedShapeException类代码如下:
public class UnSupportedShapeException extends Exception{
public UnSupportedShapeException(String message){
super(message);
}
}
当我们设计完成之后,我们便可以通过写一个main函数来执行
public class run {
public static void main(String[] args) {
try {
DrawFactory.drawPic("circle").draw();
DrawFactory.drawPic("circle").erase();
DrawFactory.drawPic("oval").draw();
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过main函数我们知道通过DrawFactory来直接创建出来对应的circle实例并运行其方法,如果没有工厂类,我们还需要一个一个实体类来创建,但是通过简单工厂模式,我们可以直接通过DrawFactory来对所有实例进行创建执行。
运行结果如下:
好了,本次简单工厂模式讲解结束!如有问题,希望大家多多讨论,共同学习。