首页 > 代码库 > 工厂模式

工厂模式

 本文为博主原创文章,若转载请指明出处

简介

工厂模式是我们最常用的实例化对象模式,是用工厂类的方法代替new操作的一种模式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象

例如Spring的IOC容器,它就是一个巨大的工厂,它负责创建所有Bean实例,整个应用的所有组件都由Spring容器负责创建。当我们想要使用某一个实例的时候,只需要从这个大容器(工厂)里获取,而不需要再使用new关键字去单独地创建一个对象,也不用关心Spring究竟是怎么创建和管理这些对象的。

简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。这里主要说简单工厂。

实例

假设一个场景,我们有一个Shape接口,接口里规定了它的实现类必须履行的服务draw()方法。Shape接口有三个实现类:Rectangle,Circle,Square。现在我们要获取这三个类的某个实例,在这个例子中,我们不再直接使用new去单独地创建它们的实例,而是将创建实例的任务交给ShapeFactory工厂(new隐藏在了工厂类里),我们则根据要创建对象的名字(比如类名)直接从工厂里取对象。

UML图:

技术分享

实现代码:

Shape接口

package factory;

/**
 * Created by ASUS on 2017/4/3.
 */
public interface Shape {
    void draw();
}

三个实现类

package factory;

/**
 * Created by ASUS on 2017/4/3.
 */
public class Circle implements Shape{
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}
package factory;

/**
 * Created by ASUS on 2017/4/3.
 */
public class Rectangle implements Shape{
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}
package factory;

/**
 * Created by ASUS on 2017/4/3.
 */
public class Square implements Shape {
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}
package factory;

/**
 * Created by ASUS on 2017/4/3.
 */
public class ShapeFactory {
    //使用 getShape 方法获取形状类型的对象
    public Shape getShape(String shapeType){
        if(shapeType == null){
            return null;
        }
        if(shapeType.equalsIgnoreCase("Circle")){
            return new Circle();
        } else if(shapeType.equalsIgnoreCase("Rectangle")){
            return new Rectangle();
        } else if(shapeType.equalsIgnoreCase("Square")){
            return new Square();
        }
        return null;
    }

}
package factory;

/**
 * Created by ASUS on 2017/4/3.
 */
public class FactoryPatternDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        //获取 Circle 的对象,并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");

        //调用 Circle 的 draw 方法
        shape1.draw();

        //获取 Rectangle 的对象,并调用它的 draw 方法
        Shape shape2 = shapeFactory.getShape("RECTANGLE");

        //调用 Rectangle 的 draw 方法
        shape2.draw();

        //获取 Square 的对象,并调用它的 draw 方法
        Shape shape3 = shapeFactory.getShape("SQUARE");

        //调用 Square 的 draw 方法
        shape3.draw();
    }
}

可以看到,在demo类FactoryPatternDemo中,我们创建了一个工厂对象,然后,下面使用的Circle对象,Square对象,Retrangle对象都是根据名字从这个工厂里直接获取。我们也不必知道这个对象究竟是怎么创建的,以及这个对象内部又有哪些实现,我们只要使用它就可以了。

使用工厂模式的优点是: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

  

 

工厂模式