重学 Java 设计模式:实战抽象工厂模式
今天我们来谈一下 Java 设计模式中的抽象工厂模式,以实战方式来介绍。我们将以升级 Redis 双集群,代理类抽象场景为例,通过抽象工厂模式的实现,来解决代理类升级问题,提高程序的可维护性、可扩展性和可读性。
什么是抽象工厂模式
抽象工厂模式是一种创建型设计模式,它允许创建一系列相关的对象,而无需指定其具体类别。抽象工厂模式通过抽象化工厂类和具体工厂类的方式,实现了客户端和具体实现类的分离。客户端只需要知道抽象工厂和抽象产品接口,就可以使用一组产品,无需知道具体的实现。
抽象工厂模式优点
- 增强程序的可维护性和可扩展性,提高程序的可读性
- 通过工厂方法封装了对象的创建过程,避免了客户端直接依赖具体实现类
- 可以轻松地替换不同的具体实现类,无需修改客户端代码
升级 Redis 双集群场景
假设我们现在有一个 Redis 双集群场景,其中一个集群存放请求较少的数据,另一个集群存放请求较多的数据。我们希望通过代理类实现在请求量超过阈值的时候,自动切换到请求量较大的集群中。
下面我们通过抽象工厂模式实现此场景。
实现思路
我们可以通过抽象工厂模式,为请求量较大的集群中的代理类进行替换。具体实现步骤如下:
- 定义抽象工厂接口,包含创建一系列代理类的方法。
- 定义抽象产品接口,包含获取请求量、代理转发等方法。
- 创建具体产品类,分别实现抽象产品接口,即代理类功能实现。
- 创建具体工厂类,实现抽象工厂接口,用于创建与请求量对应的具体代理类。
- 在客户端中,使用抽象工厂和抽象产品接口,通过配置文件或者其他方式,选择对应的工厂类,来创建具体代理类。
通过这样的实现方式,我们可以轻松地替换掉具体的代理类,而无需对客户端进行任何修改。
实现代码
抽象工厂接口
public interface ProxyFactory { /** * 获取代理类 * * @return 抽象产品 */ Proxy getProxy(); }
抽象产品接口
public interface Proxy { /** * 获取请求量 * * @return 请求量 */ int getRequestCount(); /** * 代理转发 * * @param request 请求 * @return 响应 */ String proxy(String request); }
具体产品类
请求量较小的代理类
public class SmallProxy implements Proxy { @Override public int getRequestCount() { return 1000; } @Override public String proxy(String request) { // 实现请求转发逻辑 return "SmallProxy: " + request; } }
请求量较大的代理类
public class BigProxy implements Proxy { @Override public int getRequestCount() { return 10000; } @Override public String proxy(String request) { // 实现请求转发逻辑 return "BigProxy: " + request; } }
具体工厂类
public class ProxyFactoryImpl implements ProxyFactory { private static final String CLUSTER_CONFIG = "cluster.properties"; private static final String SMALL_PROXY_CLASS = "small_proxy_class"; private static final String BIG_PROXY_CLASS = "big_proxy_class"; /** * 根据请求量创建具体代理类 * * @return 抽象产品 */ @Override public Proxy getProxy() { Properties properties = new Properties(); try { properties.load(new FileInputStream(new File(CLUSTER_CONFIG))); } catch (IOException e) { throw new RuntimeException("无法读取配置文件", e); } int requestCount = 0; // 获取请求量 if (requestCount < 5000) { // 根据请求量选择具体代理类 String smallProxyClass = properties.getProperty(SMALL_PROXY_CLASS); try { return (Proxy) Class.forName(smallProxyClass).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { throw new RuntimeException("无法实例化小型代理类", e); } } else { String bigProxyClass = properties.getProperty(BIG_PROXY_CLASS); try { return (Proxy) Class.forName(bigProxyClass).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { throw new RuntimeException("无法实例化大型代理类", e); } } } }
客户端代码
public class App { public static void main(String[] args) { ProxyFactory proxyFactory = new ProxyFactoryImpl(); Proxy proxy = proxyFactory.getProxy(); // 使用代理类实现请求转发 System.out.println(proxy.proxy("hello world!")); } }
配置文件
small_proxy_class=cn.example.SmallProxy big_proxy_class=cn.example.BigProxy
结语
本文通过实战的方式介绍了 Java 设计模式中的抽象工厂模式,并以升级 Redis 双集群,代理类抽象场景为例,演示了抽象工厂模式的实现思路和具体代码实现。在实际开发中,设计模式可以提高程序的可读性、可重用性和可维护性,希望本文对您有所帮助。