目录
一、什么是简单工厂模式
简单工厂模式提供了按需创建对象的最佳方式,是创建型设计模式的一种;
简单工厂模式又称为静态工厂模式,实质是一个工厂类根据传入的参数,动态决定应该创建哪个具体实现类(这些类是继承自一个父类或接口)的一种设计模式。
二、简单工厂模式的结构
简单工厂模式通常由以下几个部分组成
1.Factort:工厂类,其中有能根据不同的请求创建具体产品类的方法;
2.Product:抽象产品类或接口,它是实例所共有的公共接口;
3.ConcreteProduct:具体产品类,通常是Product的具体实现;
UML图示例:
如图所示:
工厂类是ShapeFactory;抽象产品类是Shape;具体产品类是Circle,Square,Rectangle等具体的形状类;
三、代码示例
步骤1:创建抽象产品类或接口Shape;
public interface Shape {
/**
* 定义一个画图的抽象方法
*/
void draw();
}
步骤2:画图的具体实现类Square和Circle类,它们都实现Shape接口的方法;
Square类:
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle类:
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
步骤3.创建工厂类ShapeFactory,里面有获取不同具体形状实现类的方法;以下示例代码里面有两种获取具体实例的方法,优缺点明显;
/**
* @Description: 工厂类:可以避免在controller中逐个添加业务实现类
* @Author: yangshilei
*/
public class ShapeFactory {
// 方法1:使用 getShape 方法获取形状类型的对象,缺点就是每次新增一种都要修改此方法的逻辑;
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
// 方法2: 通过反射获取获取,当有新增实现类时候无需修改此方法的逻辑;
public Shape getByClassName(Class<? extends Shape> clazz) throws IllegalAccessException, InstantiationException {
if(Objects.isNull(clazz)) return null;
return clazz.newInstance();
}
}
步骤4:FactoryPatternDemo 调用工厂创建对象示例;
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Square 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法
shape2.draw();
}
}
四.总结分析
-
优点:简单工厂模式,使用工厂对象创建具体的产品对象,从而使得对象的使用和创建过程进行的分离。调用方无需关注对象是谁创建的,只要通过工厂中静态方法就可以直接获取其需要的对象
-
缺点:工厂类中需要选择创建具体某个对象,所以一旦添加新的实现类时候则必须要对工厂中的方法1选择逻辑进行修改,违背了开闭原则!
-
适应场合:产品类相对较少的情况,使用简单工厂创建产品对象,这样即实现了生产者与消费者的分离,也不会在工厂类中出现太复杂的判断逻辑!