经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
创建型设计模式(上)
来源:cnblogs  作者:贵志  时间:2019/10/8 9:27:59  对本文有异议

单例模式:

  1、定义:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类

  2、实现过程要点:

    (1)单例类的构造函数为私有

    (2)提供一个自身的静态私有成员变量

    (3)提供一个公有的静态工厂方法

注:单例模式由类提供实例对象,所以需要使用 static 来定义方法和属性,使我们可通过类名来调用函数获取对象,

  静态域加载是在解析阶段,而实例化是在初始化阶段,所以静态方法不能调用普通函数和属性

  3、优点:

    (1)提供了对唯一实例的受控访问

    (2)由于在系统内存中只存在一个对象,因此可以节约系统资源

    (3)允许可变数目的实例。我们可以基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例

  4、缺点:

    (1)单例模式中没有抽象层,因此单例类的扩展有很大的困难

    (2)单例类的职责过重,在一定程度上违背了“单一职责原则”

    (3)滥用单例将带来一些负面问题;如采用垃圾自动回收机制的语言,实例化的对象若长期未被使用,

      则会被清除掉,下次要再使用该类则需重新实例化,而导致原来的状态没有了

  5、适用环境:

    (1)系统只需要一个实例对象

    (2)客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

  1. class Singleton1 {
  2. private static instance: Singleton1 = new Singleton1(); // 静态私有成员变量
  3. private constructor() {} // 私有构造函数,防止外部调用它生成其他实例
  4. // 公有静态工厂方法
  5. static getInstance(): Singleton1 {
  6. return Singleton1.instance;
  7. }
  8. }
  9. const singleton_one: Singleton1 = Singleton1.getInstance();
  10. const singleton_two: Singleton1 = Singleton1.getInstance();
  11. console.log(singleton_one === singleton_two); // true

 

构建者模式:

  1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

  2、模式结构:

    (1)抽象建造者(Builder):包含创建产品各个子部件的抽象方法的接口,通常包含返回复杂产品的方法

    (2)具体建造者(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法

    (3)指挥者(Director):调用建造者对象中的部件构造与装配方法完成复杂对象的创建

    (4)产品角色(Product):包含多个组成部件的复杂对象,由具体建造者来创建其各个部件

  3、优点:

    (1)客户端不必知道产品内部组成细节,将产品本身与产品的创建过程解耦

    (2)每一个具体建造者都相对独立,与其他具体建造者无关,用户使用不同的具体建造者即可得到不同的产品对象

    (3)可以更加精细地控制产品的创建过程

    (4)增加新的具体建造者无须修改原有类的代码,指挥者类对抽象建造者类编程,系统扩展方便,符合“开闭原则”

  4、缺点:

    (1)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,

       如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制

    (2)如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

  5、适用场景:

    (1)需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性

    (2)需要生成的产品对象的属性相互依赖,需要指定其生成顺序

    (3)对象的创建过程独立于创建该对象的类

    (4)隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品

  1. // 产品角色
  2. class Computer {
  3. private cpu: string;
  4. private mainBoard: string;
  5. private memory: string;
  6. private hardDisk: string;
  7. setCpu(cpu: string): void {
  8. this.cpu = cpu;
  9. }
  10. setMainBoard(mainBoard: string): void {
  11. this.mainBoard = mainBoard;
  12. }
  13. setMemory(memory: string): void {
  14. this.memory = memory;
  15. }
  16. setHardDisk(hardDisk: string):void {
  17. this.hardDisk = hardDisk;
  18. }
  19. getCpu(): string {
  20. return this.cpu;
  21. }
  22. getMainBoard(): string {
  23. return this.mainBoard;
  24. }
  25. getMemory(): string {
  26. return this.memory;
  27. }
  28. getHardDisk(): string {
  29. return this.hardDisk;
  30. }
  31. }
  32. // 抽象建造者
  33. interface Builder {
  34. createCpu(cpu: string): void;
  35. createMainBoard(mainBoard: string): void;
  36. createMemory(memory: string): void;
  37. createHardDisk(hardDisk: string): void;
  38. createComputer(): Computer;
  39. }
  40. // 具体建造者
  41. class ConcreteBuilder implements Builder {
  42. private computer: Computer = new Computer();
  43. createCpu(cpu: string): void {
  44. this.computer.setCpu(cpu);
  45. }
  46. createMainBoard(mainBoard: string): void {
  47. this.computer.setMainBoard(mainBoard);
  48. }
  49. createMemory(memory: string): void {
  50. this.computer.setMemory(memory);
  51. }
  52. createHardDisk(hardDisk: string): void {
  53. this.computer.setHardDisk(hardDisk);
  54. }
  55. createComputer(): Computer {
  56. return this.computer;
  57. }
  58. }
  59. // 指挥者
  60. class Director {
  61. private builder: Builder;
  62. constructor(builder: Builder) {
  63. this.builder = builder;
  64. }
  65. createComputer(cpu: string, mainBoard: string, memory: string, hardDisk: string): Computer {
  66. this.builder.createCpu(cpu);
  67. this.builder.createMainBoard(mainBoard);
  68. this.builder.createMemory(memory);
  69. this.builder.createHardDisk(hardDisk);
  70. return this.builder.createComputer();
  71. }
  72. }
  73. let builder: Builder = new ConcreteBuilder();
  74. let director: Director = new Director(builder);
  75. let computer: Computer = director.createComputer("i7", "Lenovo", "8G", "1T");
  76. console.log(computer.getCpu()); // i7
  77. console.log(computer.getMainBoard()); // Lenovo
  78. console.log(computer.getMemory()); // 8G
  79. console.log(computer.getHardDisk()); // 1T

 

原型模式:

  1、定义:用原型实例指定创建对象的种类,并且通过复用这些原型创建新的对象

  2、要点:

    (1)通过克隆来创建新的对象实例

    (2)为克隆出来的新的对象实例复制原型实例属性的值

  3、优点:

    (1)可以在运行时动态根据原型生成新的种类的对象

    (2)对客户端隐藏具体的实现类型

  4、缺点:

    每个原型的子类都必须实现 clone 的操作,尤其是包含引用类型的对象时,克隆会比较麻烦

  5、适用场景:

    (1)对象之间相同或相似,即只是个别的几个属性不同的时候

    (2)如对象的创建过程比较麻烦,但复制比较简单的时候

  1. // Prototype
  2. interface Clonable<T> {
  3. clone(): T;
  4. }
  5. // ConcretePrototype
  6. class Origin implements Clonable<Origin> {
  7. name: string;
  8. clone(): Origin {
  9. let target: Origin = new Origin();
  10. target.name = this.name;
  11. return target;
  12. }
  13. }
  14. let orign: Origin = new Origin();
  15. orign.name = "Lemon";
  16. let cloneObj: Origin = orign.clone();
  17. console.log(cloneObj.name); // Lemon

 

原文链接:http://www.cnblogs.com/lemonyam/p/11617344.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号