创建型设计模式(上)

单例模式:

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

  2、实现过程要点:

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

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

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

  3、优点:

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

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

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

  4、缺点:

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

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

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

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

  5、适用环境:

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

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

class Singleton1 {
  private static instance: Singleton1 = new Singleton1();  // 静态私有成员变量
  private constructor() {}  // 私有构造函数,防止外部调用它生成其他实例
  // 公有静态工厂方法
  static getInstance(): Singleton1 {
    return Singleton1.instance;
  }
}

const singleton_one: Singleton1 = Singleton1.getInstance();
const singleton_two: Singleton1 = Singleton1.getInstance();
console.log(singleton_one === singleton_two); // true

构建者模式:

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

  2、模式结构:

    (1)抽象建造者 Builder  (2)具体建造者 ConcreteBuilder

    (3)指挥者 Director    (4)产品角色 Product

  3、优点:

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

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

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

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

  4、缺点:

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

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

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

  5、适用场景:

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

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

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

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

// 产品角色
class Computer {
    private cpu: string;
    private mainBoard: string;
    private memory: string;
    private hardDisk: string;

    setCpu(cpu: string): void {
        this.cpu = cpu;
    }
    setMainBoard(mainBoard: string): void {
        this.mainBoard = mainBoard;
    }
    setMemory(memory: string): void {
        this.memory = memory;
    }
    setHardDisk(hardDisk: string):void {
        this.hardDisk = hardDisk;
    }

    getCpu(): string {
        return this.cpu;
    }
    getMainBoard(): string {
        return this.mainBoard;
    }
    getMemory(): string {
        return this.memory;
    }
    getHardDisk(): string {
        return this.hardDisk;
    }
}

// 抽象建造者
interface Builder {
    createCpu(cpu: string): void;
    createMainBoard(mainBoard: string): void;
    createMemory(memory: string): void;
    createHardDisk(hardDisk: string): void;

    createComputer(): Computer;
}

// 具体建造者
class ConcreteBuilder implements Builder {
    private computer: Computer = new Computer();

    createCpu(cpu: string): void {
        this.computer.setCpu(cpu);
    }
    createMainBoard(mainBoard: string): void {
        this.computer.setMainBoard(mainBoard);
    }
    createMemory(memory: string): void {
        this.computer.setMemory(memory);
    }
    createHardDisk(hardDisk: string): void {
        this.computer.setHardDisk(hardDisk);
    }

    createComputer(): Computer {
        return this.computer;
    }
}

// 指挥者
class Director {
    private builder: Builder;
    constructor(builder: Builder) {
        this.builder = builder;
    }
    createComputer(cpu: string, mainBoard: string, memory: string, hardDisk: string): Computer {
        this.builder.createCpu(cpu);
        this.builder.createMainBoard(mainBoard);
        this.builder.createMemory(memory);
        this.builder.createHardDisk(hardDisk);

        return this.builder.createComputer();
    }
}

let builder: Builder = new ConcreteBuilder();
let director: Director = new Director(builder);
let computer: Computer = director.createComputer("i7", "Lenovo", "8G", "1T");
console.log(computer.getCpu()); // i7
console.log(computer.getMainBoard());   // Lenovo
console.log(computer.getMemory());  // 8G
console.log(computer.getHardDisk());    // 1T

原型模式:

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

  2、要点:

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

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

  3、优点:

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

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

  4、缺点:

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

  5、适用场景:

    (1)需要一个类的大量对象的时候,使用原型模式是最佳选择,

      因为原型模式是在内存中对这个对象进行拷贝,要比直接new这个对象性能要好很多

    (2)如果一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算,那么可以使用原型模式

    (3)当需要一个对象的大量公共信息,少量字段进行个性化设置的时候,

      也可以使用原型模式拷贝出现有对象的副本进行加工处理

// Prototype
interface Clonable<T> {
    clone(): T;
}
// ConcretePrototype
class Origin implements Clonable<Origin> {
    name: string;

    clone(): Origin {
        let target: Origin = new Origin();
        target.name = this.name;
        return target;
    }
}

let orign: Origin = new Origin();
orign.name = "Lemon";
let cloneObj: Origin = orign.clone();
console.log(cloneObj.name); // Lemon

原文地址:https://www.cnblogs.com/lemonyam/p/11617344.html

时间: 2025-02-01 11:55:26

创建型设计模式(上)的相关文章

设计模式之:创建型设计模式(6种)

创建型设计模式有: 共6种 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 建造者模式(Builder) 原型模式(Prototype) 单例模式(Singleton) 简单工厂模式 功能:主要用于创建对象.新添加类时,不会影响以前的系统代码.核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果. 优点: 适用于不同情况创建不同的类时 缺点: 客户端必须要知

六种创建型设计模式的比较和总结

一.描述 创建型设计模式包括如下几个:简单工厂模式(Simple Factory).工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory).创建者模式(Builder).原型模式(Prototype).单例模式(Singleton). 二.六种创建型设计模式的比较 简单工厂模式:简单工厂模式又叫静态工厂模式,它定义一个具体的工厂类来负责所有产品对象的创建,因此这个工厂类的职责过大,当客户端UI与某些产品的创建有不同的要求时,需要不断地修改工厂类,增加判断逻

外观模式 门面模式 Facade 创建型 设计模式(十三)

外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本上都是会往功能更全面的方向发展,那么也就意味着我们的系统将会变得更加复杂. 系统会被划分为多个单独的子系统,每个子系统完成一部分功能,通过分工协作完成全部功能. 一个子系统也可能进一步拆分为更小的几个子系统. 程序中的文件将会越来越多,相互关联也会变得更加复杂 当使用一个功能的时候,作为客户端 你需

创建型设计模式总结(二)

上篇文章我们介绍了创建型设计模式的前三种:简单工厂模式.工厂方法模式和抽象工厂模式.这一篇文章,我们系统介绍一下其他的三种创建型设计模式:创建者模式.原型模式和单例模式. 一.创建者模式 创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象. 创建者模式通常包括如下几种角色: 1.建造者角色(Builder) 对复杂对象的

[Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

注:关乎对象的创建方式的设计模式就是"创建型设计模式"(creational design pattern) 1.1 抽象工厂模式 "抽象工厂模式"(Abstract Factory Pattern)用来创建复杂的对象,这种对象由许多小对象组成,而这些小对象都属于某个特定的"系列"(family). 比如说,在GUI 系统里可以设计"抽象控件工厂"(abstract widget factory),并设计三个"具体子

创建型设计模式总结

创建型设计模式共有五种:单例模式,简单工厂模式,抽象工厂模式,建造者模式,原型模式. 单例模式:创建一个只能new一次的类,只要这个类的资源没有被释放,无法在被实例化.确保对象的唯一性. 简单工厂模式:一个抽象实现类,一个抽象工厂类,分别需要普通类继承于这两个类,使用的时候实例化抽象工厂类指定到实现类,调用工厂方法.在有新需求时只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改.不过这样在一定时间积累之后会让自己的代码过于沉重和复杂,当程序已经满足不了原有的需求时,改起来会很困难

一、创建型设计模式

包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单工厂 又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例. 两种实现方式,第一种是通过类实例化对象创建,第二种是创建一个新对象然后包装增强其属性和功能. demo代码. 2)工厂方法 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例. 将工厂方法看作是一个实例化对象的工厂类. demo代码. 3)抽象工厂 通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例. 用它作为父类来创建一

创建型设计模式 之 原型模式

同为创建型模式的原型模式与单例模式是密不可分的,这也是最常用的设计模式之一. 原型模式是一种非常简单的设计模式.这里除了基本介绍和演示,还详细介绍了Java中原型模式的本质. 一.介绍 同样,先来看一下<研磨设计模式>的定义——用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的本质——克隆生成对象. 那么原型模式是什么意思呢?说白了就是克隆自身.我们知道Java中没有引用这个概念,Java用变量名代表引用.像 Apple a = new Apple();我们知道,想要操

&quot;围观&quot;设计模式(29)--创建型设计模式总结(单例、工厂、原型、创建者)

设计模式源码下载地址 设计模式源码下载地址 1  单例模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.----维基百科(WIKIPEDIA) 个人的理解: 单例模式概