1. 1 不可撤销
  2. 2 小年兽 程嘉敏
  3. 3 手放开 李圣杰
  4. 4 迷人的危险3(翻自 dance flow) FAFA
  5. 5 山楂树之恋 程佳佳
  6. 6 summertime cinnamons / evening cinema
  7. 7 不谓侠(Cover 萧忆情Alex) CRITTY
  8. 8 神武醉相思(翻自 优我女团) 双笙
  9. 9 空山新雨后 音阙诗听 / 锦零
  10. 10 Wonderful U (Demo Version) AGA
  11. 11 广寒宫 丸子呦
  12. 12 陪我看日出 回音哥
  13. 13 春夏秋冬的你 王宇良
  14. 14 世界が终わるまでは… WANDS
  15. 15 多想在平庸的生活拥抱你 隔壁老樊
  16. 16 千禧 徐秉龙
  17. 17 我的一个道姑朋友 双笙
  18. 18 大鱼  (Cover 周深) 双笙
  19. 19 霜雪千年(Cover 洛天依 / 乐正绫) 双笙 / 封茗囧菌
  20. 20 云烟成雨(翻自 房东的猫) 周玥
  21. 21 情深深雨濛濛 杨胖雨
  22. 22 Five Hundred Miles Justin Timberlake / Carey Mulligan / Stark Sands
  23. 23 斑马斑马 房东的猫
  24. 24 See You Again Wiz Khalifa / Charlie Puth
  25. 25 Faded Alan Walker / Iselin Solheim
  26. 26 Natural J.Fla
  27. 27 New Soul Vox Angeli
  28. 28 ハレハレヤ(朗朗晴天)(翻自 v flower) 猫瑾
  29. 29 像鱼 王贰浪
  30. 30 Bye Bye Bye Lovestoned
  31. 31 Blame You 眠 / Lopu$
  32. 32 Believer J.Fla
  33. 33 书信 戴羽彤
  34. 34 柴 鱼 の c a l l i n g【已售】 幸子小姐拜托了
  35. 35 夜空中最亮的星(翻自 逃跑计划) 戴羽彤
  36. 36 慢慢喜欢你 LIve版(翻自 莫文蔚) 戴羽彤
  37. 37 病变(翻自 cubi) 戴羽彤
  38. 38 那女孩对我说 (完整版) Uu
  39. 39 绿色 陈雪凝
  40. 40 月牙湾 LIve版(翻自 F.I.R.) 戴羽彤
夜空中最亮的星(翻自 逃跑计划) - 戴羽彤
00:00 / 04:10

夜空中最亮的星 能否听清

那仰望的人 心底的孤独和叹息

夜空中最亮的星 能否记起

那曾与我同行 消失在风里的身影

我祈祷拥有一颗透明的心灵

和会流泪的眼睛

给我再去相信的勇气

越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请指引我靠近你

夜空中最亮的星 是否知道

那曾与我同行的身影 如今在哪里

夜空中最亮的星 是否在意

是等太阳先升起 还是意外先来临

我宁愿所有痛苦都留在心底

也不愿忘记你的眼睛

哦 给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行 哒~

我祈祷拥有一颗透明的心灵

和会流泪的眼睛 哦

给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行

设计模式详解——单例、工厂、抽象工厂

tags: [#设计模式]

从今天开始,我们逐一看下常用的设计模式,希望能够尽可能搞清楚它们的应用场景,以便我们能够写出更优秀的代码。

1、单例模式

核心要点

  • 构造方法私有
  • 构造由static修饰的、返回实例的方法

优势

  • 减少创建Java实例所带来的系统开销
  • 便于系统跟踪单个Java实例的声明周期、实例状态等

示例代码

package singleton;

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

场景

线程池(threadpool)、缓存(cache)、日志对象

2、简单工厂模式

要点

  • 通过工厂类的形式进行解耦合
  • 依赖关系通过接口解耦合

优缺点

  • 让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可;
  • 避免了对象的调用者和对象的实现类以硬解码方式耦合,提高了系统的可维护性、拓展性;
  • 需要注意的一个陷阱是:当产品修改时,工厂类也要做相应的修改;

示例代码

这里的computer依赖了Printer类,但是如果直接写Printer的话,会直接影响当前类的扩展,比如我们后期增加了WriterWriterPrinter只是方法不一致,这时候如果用简单工厂模式,就可以完美解决这个问题。

当然,这时依然需要修改OutputFactory的代码,但是对Computer是不需要修改的。

public class Computer {
    private Output out;
    public Computer(Output out) {
        this.out = out;
    }
    
    public void keyIn(String msg) {
        out.getData(msg);
    }
    
    public void print() {
        out.out();
    }
}

简单工厂

package simplefactory;

public class OutputFactory {
    public Output getOutput() {
        return new Printer();
    }
}

接口

package simplefactory;

public interface Output {
    final int MAX_CACHE_LINE=200;
    void getData(String msg);
    void out();
}

接口实现类

package simplefactory;

public class Printer implements Output {
    private String[] printData = new String[MAX_CACHE_LINE];
    private int dataNum = 0;

    @Override
    public void getData(String msg) {
        if(dataNum >= MAX_CACHE_LINE) {
            System.out.println("输出队列已满,添加失败");
        } else {
            printData[dataNum++] = msg;
        }
        
    }

    @Override
    public void out() {
        while(dataNum > 0) {
            System.out.println("打印机打印:" + printData[0]);
            System.arraycopy(printData, 1, printData, 0, --dataNum);
        }
        
    }

}

测试类

package simplefactory;

public class Test {
    public static void main(String[] args) {
        OutputFactory of = new OutputFactory();
        Computer c = new Computer(of.getOutput());
        c.keyIn("hello world");
        c.keyIn("java");
        c.keyIn("spring");
        c.print();
    }
}

3、工厂方法和抽象工厂

要点

  • 和简单工厂相比,工厂方法多了一个接口,也就是工厂接口,Ouput子类的工厂类均继承该接口,实现getOutput()方法
  • 当使用工厂方法设计模式时,对象调用者需要与具体的工厂类进行耦合:当需要不同对象时,程序需要调用相应工厂对象的方法来得到所需的对象
  • 对于采用工厂方法的设计架构,客户端代码成功与被调用对象实现了分离,但带来了另一种耦合:客户端代码与不同的工厂类耦合
  • 为了解决上面的耦合,增加一个工厂类,用于创建不同的工厂对象,这个特殊的工厂类被称为抽象工厂类,这种设计模式被称为抽象工厂模式

比较

和简单工厂相比,抽象工厂降低了目标实例与实例工厂的耦合性,但是它又引入了抽象工厂的耦合关系。

在简单工厂模式中,要创建一个对象的实例,直接调用该对象的工厂方法即可,当然前提条件是增加该对象时要同步增加它的工厂方法;

在抽象工厂模式中,不仅对实例对象做了抽象处理,还对对象的工厂做了抽象处理,所以在实例化一个对象的时候,要先实例化它的工厂,然后再通过工厂方法实例化对象(实线表示代码实际执行流程,虚线表示解耦过程,工厂的工厂创建出来的是抽象工厂的实例,抽象工厂最终创建的是对象的抽象接口)

示例代码

实例工厂接口:

// 工厂接口
package abstractfactory;

import simplefactory.Output;
/**
 * 
 *TODO output工厂接口
 *
 * @author CaoLei 2018年7月1日下午3:19:36
 * OutputFactory
 */
public interface OutputFactory {
    
    Output getOutput();

}

实例工厂实现:

// 工厂方法,工厂类

package abstractfactory;

import simplefactory.BetterPrinter;
import simplefactory.Output;

public class BetterPrinterFactory implements OutputFactory {

    @Override
    public Output getOutput() {
        return new BetterPrinter();
    }

}

实例工厂实例化方法:

// 抽象工厂,抽象工厂类
package abstractfactory;

public class OutputFactoryFactory {
    public static OutputFactory getOutputFactory(String type) {
        if ("better".equals(type)) {
            return new BetterPrinterFactory();
        } else {
            return new PrinterFactory();
        }

    }
}

好了,今天就先说这三种设计模式,明天我们来继续看其他的设计模式。

posted @ 2021-10-15 22:04  云中志  阅读(85)  评论(0编辑  收藏  举报