简单工厂模式:
当我们不希望通过客户端使用new关键字来主动创建对象的时候,一般会选择将对象的创建封装到一个类中,这个类一般被称为工厂类。这种设计的模式被称为简单工厂设计模式。不过该模式存在很大的弊端,当需要创建的对象类型增加的时候则需要修改工厂类中的代码,例如增加if-else的判断来确定创建对象的类型。通过Java的反射可以很好的解决这个问题。
Java反射:
反射有什么作用,为什么能解决简单工厂模式中难以扩展的问题?首先,反射机制指的是在程序运行时能够过去自身信息。它可以在运行时构造一个类的对象,也可以在运行时判断一个类所具有的成员变量和方法。刚开始看的时候我也很难理解,不过看到他创建对象的过程的时候我就明白了。直接看代码吧。
Class.forName(className).getDeclaredConstructor().newInstance();
不难看出这段代码最后的newInstance()指的是创建一个类的实例,很显然他返回的是某个类的对象,从后往前看, getDeclaredConstructor()则是一个与构造函数相关的函数,所以后两者结合很容易得出大概意思是通过某个构造函数创建一个类的实例。显然,整段代码的意思就已经很明了了,以className为名的类通过某个构造函数创建一个该类的实例。这一实现过程依赖于Class类。这里说的很模糊,但是应该很容易理解,至于三个函数的返回值可以查看文档,严格的来说是不应该这样理解的。
下面就直接看一下通过反射机制实现的简单工厂模式。
interface IMessage {
void send();
}
class NetMessage implements IMessage {
@Override
public void send() {
System.out.println("网络消息发送成功!");
}
}
class CloudMessage implements IMessage {
@Override
public void send() {
System.out.println("云消息发送成功!");
}
}
class Factory{
public Factory(){}
public static IMessage getInstance(String className) throws Exception {
IMessage instance = null;
instance = (IMessage)
Class.forName(className).getDeclaredConstructor().newInstance();
return instance;
}
}
public class Client{
public static void main(String[] args) throws Exception {
IMessage netMessage= Factory.getInstance("FanShe.NetMessage");
netMessage.send();
IMessage cloudMessage= Factory.getInstance("FanShe.CloudMessage");
cloudMessage.send();
}
}
如此便通过反射实现了简单工厂模式。其中参数className表示的是所需类的完全限定名。但是这样还不够,我希望我的工厂不仅仅能创建IMessage型的对象,还希望他创建更多其他的类型。例如我加一个住房服务的类,并且该类实现了IService类,则原来的代码就会出现问题,不过这部分可以用泛型来解决,废话少收,直接看代码。
interface IService {
void service();
}
class HouseService implements IService {
@Override
public void service() {
System.out.println("提供住房服务!");
}
}
class Factory{
public Factory(){}
@SuppressWarnings("unchecked")
public static <T>T getInstance(String className,Class<T> tClass) throws
Exception {
T instance = null;
instance = (T) Class.forName(className).
getDeclaredConstructor().newInstance();
return instance;
}
}
public class Client{
public static void main(String[] args) throws Exception {
IMessage iMessage = Factory.getInstance("FanShe.NetMessage",IMessage.class);
iMessage.send();
IService iService =Factory.getInstance("FanShe.HouseService",IService.class);
iService.service();
}
}
这部分属于Java泛型的知识,不在此赘述。至此已通过反射机制实现简单工厂模式。
(该文章内容来自与阿里云中的教学视频学习,仅为学习笔记用)