Android与设计模式(1)单例/工厂/策略/命令

详细代码请见https://github.com/zackLangChina/DesignPatternLearning

Android与设计模式(1)
单例模式 ** 工厂模式 ** 策略模式 ** 命令模式
Android与设计模式(2)
观察者模式 ** 备忘录模式 ** 模板方法模式 ** 中介者模式
Android与设计模式(3)
代理模式 ** 适配器模式 ** 装饰模式 ** 享元模式
Android与设计模式(4)
外观模式 ** 桥接模式 ** MVP模式

0,本文的目的

设计模式的意义,在于使用额外的代码对我们的业务功能进行封装,以实现面向对象的六大原则,便于维护。
但是,脱离实际应用场景去学习这些设计模式,无异于小和尚念经,学了就忘,就算不忘,也不知道什么时候拿出来用。
此系列文章,希望和大家一起联系Android中的实际应用场景来学习设计模式,并使用简单的demo代码实现设计模式的使用。

1,单例模式

使用场景:

用于只有唯一实例的类。

Android中的应用:

服务类均为单例

代码示例:

//饿汉模式(预先实例化)
class SinglePatternHunger {
    public static SinglePatternHunger amInstant = new SinglePatternHunger();

    private SinglePatternHunger() { System.out.println("I am SinglePatternHunger");}

    public static SinglePatternHunger getInstance() {
        return amInstant;
    }
}
//懒汉模式(调用时才实例化)
//静态内部类和非静态内部类一样,都是在被调用时才会被加载
//可以保证getInstance调用时才实例化外部类,实现懒汉单例模式
class SinglePatternLazy {

    private SinglePatternLazy() {System.out.println("I am SinglePatternLazy");}

    public static synchronized SinglePatternLazy getInstance() {
        return InstantHolder.mInstant;
    }

    private static class InstantHolder {
        private static SinglePatternLazy mInstant = new SinglePatternLazy();
    }
}

2,工厂模式

工厂模式

使用场景:

使客户不需要知道具体的产品,告诉工厂想要哪种类型的产品,由工厂代为选择。适用于具体生产的产品可能更换的场景。

例如:

有一个专门针对有矿用户(客户)的手机店(工厂),用户来买手机,每次都跟老板说,给我来个最贵的!第一年,工厂给的都是iphone11(product),第二年都变iphone12(product)了。我们不需要更改客户的代码,只需要把工厂里生产的产品替换掉(改变产生接口返回的具体产品)就可以了。

当然,一个工厂可以生产多种产品,比如上面的手机店,可以设计成不但可以生产”最贵的“手机,也能同时生产”最便宜“的手机,客户进门后喊一嗓子:”最贵的“就给拿个大iphone,喊”最便宜的“就给拿个老人机。

Android中的应用:

BitmapFactory

代码示例:

//具体工厂类
class NiuBiFactory implements Factory{

    @Override
    public Production product() {
        return new MostNiuBiProduction();
    }
}
//工厂接口
interface Factory {
    Production product();
}
//产品基类
abstract class Production {
}
//被淘汰不再生产的产品,从工厂撤下来了
class NiuBiProduction extends Production {
    public NiuBiProduction() {
        System.out.println("product NiuBiProduction");
    }
}
//目前生产的产品,通过工厂生产
class MostNiuBiProduction extends Production {
    public MostNiuBiProduction() {
        System.out.println("product MostNiuBiProduction");
    }
}

3,策略模式

策略模式

使用场景:

一般用于算法选择。

客户通过策略模式的类调用”去噪“算法,但并不关心是使用哪种去噪算法,那么策略模式类可以根据需要,从多种去噪算法种选择一种去噪算法供客户调用。

这样,就可以方便地为客户的调用进行定制,并且之后有更新更好的算法加入,也可以不修改客户代码而使客户享受到最新的算法。

Android中的应用:

方法中根据用户Android系统的版本,执行不同的代码以实现相同的功能。这也算一种策略模式吧,因为客户端可以使用同一个接口,由策略类为客户选择执行的代码。

代码示例:

//策略类
public class StrategyPattern {
    private Denoising curDenoiseStrategy = new NiubiDenoising();

    public void doDenoise() {
        //客户端不知道具体用哪个Denoising接口实现类,由策略类选择
        curDenoiseStrategy.doDenoise();
    }
}
//算法接口
interface Denoising {
    void doDenoise();
}
//具体算法
class NiubiDenoising implements Denoising {

    @Override
    public void doDenoise() {
        System.out.println("Do Denoise fast and nice!");
    }
}

4,命令模式

使用场景:

命令模式将每个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;将请求进行排队或者记录请求日志,以及支持可撤销操作。

即,将命令封装并存储,以便按顺序执行或中途修改删除。

Android中的应用:

Message和Handler的组合,就是命令模式。将命令封装为Message,通过Looper中的MessageQueue存储,最终给到Handler执行。

代码示例:

import java.util.ArrayList;
import java.util.List;
//命令接口
interface Command {
    public void execute();
}
//具体命令:开火!
class FireCommand implements Command {

    @Override
    public void execute() {
        System.out.println("Fire !!");
    }
}
//具体命令:停火!
class StopCommand implements Command {

    @Override
    public void execute() {
        System.out.println("Stop !!");
    }
}
//指挥官,负责下达(实例化)命令给执行者
class commander {
    private List<Command> commandList = new ArrayList<Command>();
    private Soldier mSoldier;

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

推荐阅读更多精彩内容

  • javascript设计模式与开发实践 设计模式 每个设计模式我们需要从三点问题入手: 定义 作用 用法与实现 单...
    穿牛仔裤的蚊子阅读 4,065评论 0 13
  • 相信大家都曾经下定决心把23种设计模式牢记于心,每次看完之后过一段时间又忘记了~,又得回去看,脑子里唯一依稀记得的...
    Near尼尔阅读 392评论 0 2
  • 0.提前说明 模式选择的方法1)模式的功能——看是否能解决问题2)模式的本质——看模式是否主要用来解决这类问题3)...
    王侦阅读 1,060评论 0 1
  • 工厂模式 单体模式 模块模式 代理模式 职责链模式 命令模式 模板方法模式 策略模式 发布-订阅模式 中介者模式 ...
    HelloJames阅读 1,010评论 0 6
  • 策略模式 1、策略模式概念 定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换。策略模式主要是管理一...
    嗟嗟嗟阅读 394评论 0 0