简单工厂模式

2020-06-22  本文已影响0人  nieniemin

什么是简单工厂模式

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

模式角色

  1. 工厂角色(Factory):主要负责创建具体的实例。
    2.抽象实体角色(Shape):简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    3.具体实现角色(Circle,Square):所有由工厂角色创建出来的实例都是具体实现。

UML类图

简单工厂模式

代码实现

// 抽象实体角色
public abstract class Shape extends Factory {
    public abstract void draw();
}
// .具体实现角色Circle
public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("Circle::draw() method.");
    }
}
// .具体实现角色Square 
public class Square extends Shape {
    @Override
    public void draw() {
        System.out.println("Square::draw() method.");
    }
}
// 工厂角色
public class Factory {

    public Shape getShape(String shapeType) {

        if (shapeType.equalsIgnoreCase("circle")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("square")) {
            return new Square();
        }
        return null;
    }


    /**
     * 反射
     *
     * @param cla
     * @return
     */
    public Shape getShape(Class cla) {
        Shape iShape = null;

        try {
            iShape = (Shape)cla.asSubclass(Shape.class).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return iShape;
    }
}
public class TestFactory {

    public static void main(String[] args) {
        Factory factory = new Factory();

        // 方法-1
        Shape circle = factory.getShape("circle");
        circle.draw(); // 1 输出结果:Circle::draw() method.
        Shape square = factory.getShape("square");
        square.draw(); // 2 Square::draw() method.

        // 反射方法-2
        Shape shapeCircle = factory.getShape(Circle.class);
        shapeCircle.draw(); // 3 输出结果:Circle::draw() method.
        Shape shapeSquare = factory.getShape(Square.class);
        shapeSquare.draw(); // 4 Square::draw() method.
    }
}

优点
通过代码可以看到,调用者想创建一个对象,只要知道其名称就可以了不需要再new Circle,new Square,new Rectangle ... 屏蔽了产品的具体实现,调用者只关心产品的接口即可。

缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。如果用方法1实现的话明显不符合设计模式的开闭原则。

完整代码地址

简单工厂模式完整代码

上一篇 下一篇

猜你喜欢

热点阅读