安卓设计模式(八)工厂方法模式

工厂方法模式是创建性设计模式之一,一般用于复杂对象的创建

该系列其他文章:

定义: 定义一个用于创建对象的接口(非指interface),让子类决定实例化哪个类

使用场景: 创建复杂对象,且有多种功能相同的对象

实现举例

下面以Androd经常用到的缓存Cache来举例说明:

缓存接口,定义所有缓存必须实现的方法

public interface ICache {
    String get(String key);

    void put(String key, String value);

    void removeCache(String key);

    void clearCache();
}

工厂方法根据需求又用几种不同的实现,不过思想是一致的,下面分别说明

1. 简单工厂(静态工厂)

如果我们程序中整体只需要一种缓存即可,不需要多种缓存,如磁盘缓存,所以只需要单一缓存子类及单一工厂即可:

    /**
     * 磁盘缓存,具体方法实现省略
     */
    public class DiskCache implements ICache {
    
    
        @Override
        public String get(String key) {
            return null;
        }
    
        @Override
        public void put(String key, String value) {
    
        }
    
        @Override
        public void removeCache(String key) {
    
        }
    
        @Override
        public void clearCache() {
    
        }
    }

    /**
     * 简单工厂,只创建一种缓存
     */
    public class StaticCacheFactory {
        
        public static ICache create() {//注意这里直接使用static方法
            return new DiskCache();
        }
    } 
    
    //使用
    ICache iCache = StaticCacheFactory.create();
    iCache.get("");

2. 工厂与产品一对一,即每个工厂负责生产一种产品

    /**
     * 工厂接口,定义所有工厂的必须实现的方法
     */
    public interface ICacheFactory {
        
        ICache create();//创建缓存
    }

    /**
     * 磁盘缓存工厂,用于生产磁盘缓存实例
     */
    public class DiskFactory implements ICacheFactory {
        @Override
        public ICache create() {
            return new DiskCache();
        }
    }

    /**
     * 内存缓存工厂,用于生产内存缓存实例
     */
    public class MemoryFactory implements ICacheFactory {
        @Override
        public ICache create() {
            return new MemoryCache();
        }
    }

    //使用:
    ICacheFactory factory = new DiskFactory();
    //如果需要内存缓存
    //ICacheFactory factory = new MemoryFactory();
    ICache iCache = factory.create();
    iCache.clearCache();

3. 工厂与产品一对多,即每个工厂可以生产多种产品

工厂接口,定义所有工厂的必须实现的方法:

public interface ICacheFactory {

    <T extends ICache> T create(Class<T> c);//创建缓存实例
} 

具体工厂,可根据需求生产不同的产品:

public class CacheFactory implements ICacheFactory {
    @Override
    public <T extends ICache> T create(Class<T> c) {
        T cache = null;
        try {
            cache = (T) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cache;
    }
}

使用:

ICacheFactory cacheFactory = new CacheFactory();
ICache diskCache = cacheFactory.create(DiskCache.class);//根据类型创建不同的缓存实例
ICache memoryCache = cacheFactory.create(MemoryCache.class);//根据类型创建不同的缓存实例

diskCache.clearCache();    
memoryCache.clearCache();    

总结

由以上可以的举例可以看到使用工厂方法创建对象简单明了,如果上面的缓存对象创建时需要设置很多参数,初始化数据等等,那么使用工厂方法模式相对于直接new一个实例有很大优势.工厂方法模式将对象的创建过程封装在工厂中,使得客户端无需再关心实例的创建和初始化过程.

实际开发中第三种使用的比较多,根据需求创建不同实例.

关于作者

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容