其实,严格意义上来讲,简单工厂不算是一个标准的设计模式,但是在我们的实际开发中,却经常使用。所以,在真正了解GOF 的23种设计模式之前,我们先来了解一下简单工厂。
简单回顾
我们都知道,Java有一个重要的原则,叫”面向接口编程”,那我们举一个简单的例子来说明一下,何谓”面向接口编程”。
定义一个接口
既然是面向接口编程,那么肯定要先有一个接口。
public interface Inter {
/**
* 定义一个方法
* @param s
*/
void function(String s);
}
接口实现
示例代码如下:
public class ImpOne implements Inter {
@Override
public void function(String s) {
System.out.println("This is ImpOne "+s);
}
}
客户端代码
接下来,我们来看客户端是如何调用。示例代码如下:
public class Client {
public static void main(String[] args) {
Inter inter = new ImpOne();
inter.function("测试接口");
}
}
问题在哪里
我们看上面的代码,其实,只要是有 Java 基础的人,都知道这么写。但是问题出来哪里?
我们知道,其实接品的思想,有一个很重要的一点,就是”封装隔离”。在上述的代码中,客户端直接实例化了一个 ImpOne。也就是说,客户端直接知道了实现类。这显然不是我们想要的。那该如何解决?
简单工厂
解决方案
解决上述问题的一个方案就是简单工厂。那我们先来看一下简单工厂的定义:
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
分析上面的问题,我们不想要让客户端知道具体的实现类,那么,我们是不是可以创建一个类,而有这个类生成具体的实现类,然后再由客户端调用呢?那接下来我们就看如何实现。
简单工厂示例代码
1:定义接口
public interface Inter {
/**
* 定义一个方法
* @param s
*/
void function(String s);
}
接口实现
我们先写一个实现类,ImpOne.
public class ImpOne implements Inter {
@Override
public void function(String s) {
System.out.println("This is ImpOne "+s);
}
}
接下来再写一个实现类,ImpTwo.这个实现类的代码与 ImpOne 基本一样。
public class ImpTwo implements Inter {
@Override
public void function(String s) {
System.out.println("This is ImpTwo "+s);
}
}
工厂类
接下来,我们看看简单工厂的实现。实现代码如下:
public class SimpleFactory {
/**
* 根据类型,创建具体的实现类.
* @param type
* @return
*/
public static Inter createInter(int type) {
Inter inter = null;
switch (type) {
case 0:
inter = new ImpOne();
break;
case 1:
inter = new ImpTwo();
break;
}
return inter;
}
}
客户端实现
最后,我们看一下客户端的代码:
public class Client {
public static void main(String[] args) {
//通过工厂类,获取接口对象
Inter inter = SimpleFactory.createInter(0);
inter.function("测试接口");
}
}
这样,就达到文首我们想要的结果。