实际使用 工厂模式+适配器模式

目录

大讲设计模式的文章有很多,可以实际用起来却从来没有人讲过,我一直都坚信,必须是 自己见过猪跑,才会想起怎么去吃猪肉,很多文章都只是讲一个例子,但是实际生产中,很多人是无法根据例子直接可以在实际开发中使用的,所以我直接告诉你怎么来使用设计模式,保证你可以直接在项目中使用,

使用场景

在项目中我需要使用缓存, redis集群, redis, 本地缓存,于是我就有三种选择,为了能方便的创建者三种缓存机制,于是我需要一个工厂类,用于生产这三中 缓存的 容器,
于是 很自然我就 想到了 工厂模式,直接使用最简单的工厂模式

1.
public class RedisCache{ 
  方法: get()  set()
          remove()  hash()  exsits()
}
  两者方法都差不多,因为使用时 差不多
2. public class LocalCache{
   方法: get()  set()
          remove()  hash()  exsits()

}

3。工厂类
public class Cache {


 static {
        Properties properties = new Properties();

        try {
            InputStream fs = Cache .class.getClassLoader().getResourceAsStream("cache.properties");
            properties.load(fs);

            if (properties.getString("handle").equalsIgnoreCase("redis")) {
                cache = new RedisCache(Redis.class);
            } else if (properties.getString("handle").equalsIgnoreCase("rediscluster")) {
                cache = new RedisCache(RedisCluster.class);
            } else {
                cache = new LocalCache();
            }
        } catch (IOException e) {
            e.printStackTrace();
            cache = new LocalCache();
        }
        properties.clear();
    }

}

**工厂类中 我直接使用, static 块,当加载这个类时,就会执行这个初始化的操作,通过配置文件控制,到底选择哪一种的 缓存机制,

其次 这三种缓存机制,肯定有很多方法是一样的,于是我需要 把他们抽象出来,于是我需要一个 interface 被 RedisCache+LocalCache 实现,

public interface CacheAdapter {

    Boolean exists(String type, Object key);

    void set(String type, Object key, Object value);
    }

于是 RedisCache+LocalCache需要 implements CacheAdapter 

再者 由于 我使用了 Redis + RedisCluster
这两者不管有多少个链接 肯定是只能有一套链接配置,所以我这里需要使用到了单例模式

public class RedisConfig { 
    private static RedisConfig redisConfig = null;
   //  懒汉式:
    public static RedisConfig getInstance() {
        if (redisConfig == null) {
            redisConfig = new RedisConfig();
        }

        return redisConfig;
    }
 }

这两者 又是 相当于 同工厂生产出的不同 车,但是车的 各种属性和方法又是一样的,于是 我需要给他们 抽象出一个 父类 ,

1public abstract class RedisBase {
    public abstract void set(byte[] key, byte[] value);

    public abstract void set(byte[] key, byte[] value, int seconds); 
}
2public class Redis extends RedisBase {

    private String auth = null;
    private List<JedisShardInfo> redisHosts = new ArrayList<>();

    private static ShardedJedisPool pool = null;

3public class RedisCluster extends RedisBase {

    private String auth = null;
    private JedisCluster jedisCluster;
    private Set<HostAndPort> jedisClusterNodes = new HashSet<>();
    private int timeout = 0;

    public RedisCluster() {
        if (jedisCluster == null) {
            JedisPoolConfig config = getConfig();
            jedisCluster = new JedisCluster(jedisClusterNodes, timeout, config);
        }
    }

继续探究,我使用 Cache这个工厂
由于我将 RedisCache+LocalCache 做了抽象
于是 我这里使用了 对象的适配器模式+简单工厂模式结合

public class Cache {

    private static CacheAdapter cache; 

    static {
        Properties properties = new Properties();

        try {
            InputStream fs = RedisCache.class.getClassLoader().getResourceAsStream("cache.properties");
            properties.load(fs);

            if (properties.getString("handle").equalsIgnoreCase("redis")) {
                cache = new RedisCache(Redis.class);
            } else if (properties.getString("handle").equalsIgnoreCase("rediscluster")) {
                cache = new RedisCache(RedisCluster.class);
            } else {
                cache = new LocalCache();
            }
        } catch (IOException e) {
            e.printStackTrace();
            cache = new LocalCache();
        }
        properties.clear();
    }

    public static void set(String type, Object key, Object value) {
        cache.set(type, key, value);
    }

详细代码参考:http://download.csdn.net/download/sinat_27639721/10139171

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值