详解设计模式之简单工厂模式

1、什么是简单工厂模式?

把一些相关类的对象的创建封装在另一个类中,这样在上层的客户端不需要明白相关类对象是如何创建的,只需要调用另一个类的相关方法获取实例即可。另一个类就是所说的工厂类。为了避免每次使用工厂时都创建工厂实例,获取相关类实例的方法一般使用静态方法,所以简单工厂一般也叫静态工厂。

2、�什么时候使用工厂模式?

当你要对上层隐藏一些对象从而达到解耦的效果时可以使用简单工厂。

3、�如何使用工厂模式?

  • 先看下不使用模式如何创建接口实例
不使用模式.png

汽车接口代码:

public interface CarApi {
    public void run();
}

起亚汽车实现代码:

public class KiaImpl implements CarApi {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("起亚跑起来");
    }

}

客户端代码:

public class Client {
    public static void main(String[] args) {
        CarApi carApi = new KiaImpl();
        carApi.run();
    }
}

如上,不使用模式的时候,客户端不仅依赖接口,更知道了接口的实现类是KiaImpl。要知道Java面向接口编程就是为了封装隔离,达到解耦模块的目的。这里虽然使用了接口,但是充其量只用到了其多态,至于封装隔离还是没影的事儿。

  • 看下使用简单工厂是如何实现的
使用模式.png

汽车接口和起亚实现代码如上不变,宝马实现代码如下:

public class BmwImpl implements CarApi {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("宝马跑起来");
    }

}

汽车工厂代码如下:

public class CarFactory {
    public static CarApi getCar(int type) {
        CarApi car;
        if (type == 0) {
            car = new KiaImpl();
        } else {
            car = new BmwImpl();
        }
        return car;
    }
}

客户端代码如下:

 public class Client {
    public static void main(String[] args) {
//      CarApi carApi = new KiaImpl();
//      carApi.run();
        CarApi kia = CarFactory.getCar(0);
        kia.run();
        CarApi bmw = CarFactory.getCar(1);
        bmw.run();
    }
}

通过客户端代码可知,把实现类封装在工厂后,客户端只需要调用工厂静态方法就能拿到实现类实例,而不需要知道这些实现类是如何创建实现的,达到了解耦的目的。

有一点要注意:如果接口有多个实现类,在工厂中如何确定想要获取哪个实例?这时就要在静态方法中传入参数,这时客户端就要知道参数类型代表的意思。所以此时底层要向上层暴露一些信息以供使用。

推荐阅读更多精彩内容