设计模式--抽象工厂模式(其他工厂的工厂)

创建型模式
抽象工厂也可以称为其他工厂的工厂,也就是说这个抽象工厂可以创建其他工厂。

模拟一个老的资源由于某种原因不太能使用了,此时需要升级,升级资源为多个,根据不同场景使用不同的资源。

如下例子:

  1. 模拟一个老的资源
//接口
public interface OldResourceService {String get(String key);String set(String key);String del(String key);
}
//实现类
//因为老旧的实现类不重要,所以这里没有写什么实现。
public class OldResourceServiceImpl implements OldResourceService{@Overridepublic String get(String key) {return null;}@Overridepublic String set(String key) {return null;}@Overridepublic String del(String key) {return null;}
}
  1. 新的资源
//新的资源1
public class Resource1 {public String getKey(String key){System.out.println("Resource1 获得了数据key,"+key);return key;}public String deleteK (String key){System.out.println("Resource1 删除了key:" + key);return key;}public String setK (String key){System.out.println("Resource1 设置了key:" + key);return key;}
}
//新的资源2
public class Resource2 {public String get(String key){System.out.println("Resource2 获得了数据key,"+key);return key;}public String delk (String key){System.out.println("Resource2 删除了key:" + key);return key;}public String setExtent (String key){System.out.println("Resource2 设置了key:" + key);return key;}
}
  1. 如上发现,老得资源和新的资源连接口定义都不太一样,所以定义一个适配器类
//适配器接口
public interface IResourceAdapter {String get(String key);String set(String key);String del(String key);}
//适配器两个实现
public class ResourceOneAdapter implements IResourceAdapter{private Resource1 resource1 = new Resource1();@Overridepublic String get(String key) {return resource1.getKey(key);}@Overridepublic String set(String key) {return resource1.setK(key);}@Overridepublic String del(String key) {return resource1.deleteK(key);}
}public class ResourceTwoAdapter implements IResourceAdapter{private Resource2 resource2 = new Resource2();@Overridepublic String get(String key) {return resource2.get(key);}@Overridepublic String set(String key) {return resource2.setExtent(key);}@Overridepublic String del(String key) {return resource2.delk(key);}
}
  1. 用代理类实现
public class JDKInvocationHandler implements InvocationHandler {private IResourceAdapter iResourceAdapter;public JDKInvocationHandler(IResourceAdapter iResourceAdapter){this.iResourceAdapter = iResourceAdapter;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return IResourceAdapter.class.getMethod(method.getName() , ClassLoaderUtils.getClazzByArgs(args)).invoke(iResourceAdapter,args);}
}/*** 代理抽象工厂*/
public class JDKProxyFactory {public static <T> T getProxy(Class resourceClazz , Class< ? extends IResourceAdapter> resourceAdapter) throws Exception {InvocationHandler handler = new JDKInvocationHandler(resourceAdapter.newInstance());ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();return (T) Proxy.newProxyInstance(contextClassLoader,new Class[]{resourceClazz},handler);}}
  1. 测试类来了
public class ABSFactoryTest {public static void main(String[] args) throws Exception {OldResourceService proxyResourceOne = JDKProxyFactory.getProxy(OldResourceService.class, ResourceOneAdapter.class);proxyResourceOne.set("trset");OldResourceService proxyResourceTwo = JDKProxyFactory.getProxy(OldResourceService.class, ResourceTwoAdapter.class);proxyResourceTwo.get("trget");}
}
/*
> Task :ABSFactoryTest.main()
Resource1 设置了key:trset
Resource2 获得了数据key,trget
*/

最后

public class ClassLoaderUtils {public static Class<?>[] getClazzByArgs(Object[] args) {Class<?>[] parameterTypes = new Class[args.length];for (int i = 0; i < args.length; i++) {if (args[i] instanceof ArrayList) {parameterTypes[i] = List.class;continue;}if (args[i] instanceof LinkedList) {parameterTypes[i] = List.class;continue;}if (args[i] instanceof HashMap) {parameterTypes[i] = Map.class;continue;}if (args[i] instanceof Long){parameterTypes[i] = long.class;continue;}if (args[i] instanceof Double){parameterTypes[i] = double.class;continue;}if (args[i] instanceof TimeUnit){parameterTypes[i] = TimeUnit.class;continue;}parameterTypes[i] = args[i].getClass();}return parameterTypes;}}