Java设计模式(二)简单工厂模式

Author Avatar
wshunli 9月 07, 2018
  • 在其它设备中阅读本文章

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式可以分为三类:

1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)

本文及主要介绍简单工厂模式。

简单工厂模式

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。

在简单工厂模式中,可以根据参数的不同返回不同类的实例。

简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

简单工厂模式

简单工厂模式包含如下角色:

(1) Factory:工厂角色
工厂角色负责实现创建所有实例的内部逻辑。

(2) Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的 公共接口

(3) ConcreteProduct:具体产品角色
具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

1、创建抽象产品接口

public interface Shape {
    void draw();
}

2、实现具体产品角色

public class Point implements Shape {
    @Override
    public void draw() {
        System.out.println("Point.draw()");
    }
}
public class Line implements Shape {
    @Override
    public void draw() {
        System.out.println("Line.draw()");
    }
}
public class Plane implements Shape {
    @Override
    public void draw() {
        System.out.println("Plane.draw()");
    }
}

3、工厂角色,生成基于给定信息的实体类的对象

public class ShapeFactory {
    // 使用 getShape 方法获取形状类型的对象
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("POINT")) {
            return new Point();
        } else if (shapeType.equalsIgnoreCase("LINE")) {
            return new Line();
        } else if (shapeType.equalsIgnoreCase("PLANE")) {
            return new Plane();
        }
        return null;
    }
}

4、使用该工厂,通过传递类型信息来获取实体类的对象

public class SimpleFactoryMain {
    public static void main(String[] args) {

        ShapeFactory shapeFactory = new ShapeFactory();
        //获取 Point 的对象,并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("POINT");
        //调用 Point 的 draw 方法
        shape1.draw();
        //获取 Line 的对象,并调用它的 draw 方法
        Shape shape2 = shapeFactory.getShape("LINE");
        //调用 Line 的 draw 方法
        shape2.draw();
        //获取 Plane 的对象,并调用它的 draw 方法
        Shape shape3 = shapeFactory.getShape("PLANE");
        //调用 Plane 的 draw 方法
        shape3.draw();
    }
}

简单工厂模式优缺点:

优点:
通过使用工厂类,外界不再需要关心如何创造各种具体的产品,只要提供一个产品的名称作为参数传给工厂,就可以直接得到一个想要的产品对象,并且可以按照接口规范来调用产品对象的所有功能(方法)。构造容易,逻辑简单。

缺点:
1、简单工厂模式中的 if else 判断非常多,当系统中的具体产品类不断增多时候,就要不断的修改工厂类,对系统的维护和扩展不利。
2、一个工厂类中集合了所有的类的实例创建逻辑,什么时候它不能工作了,整个系统都会受到影响。
3、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

适用场景

1、工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
2、客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

本文实现源码https://github.com/wshunli/design-patterns/tree/master/src/ch02

参考资料
1、工厂模式 | 菜鸟教程
http://www.runoob.com/design-pattern/factory-pattern.html
2、JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式) - CSDN博客
https://blog.csdn.net/jason0539/article/details/23020989
3、java中的工厂模式 - 简书
https://www.jianshu.com/p/bf8341c75304

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 https://paypal.me/wshunli 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。
本文链接:https://www.wshunli.com/posts/6ae09785.html