抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

创建型设计模式

创建型设计模式是一类处理对象创建的设计模式,通过某种方式控制对象的创建来避免基本对象创建时可能导致设计上的问题或增加设计上的复杂度

简单工厂模式

(1)简单工厂模式(Simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。
simple-factory1
simple-factory2

(2)一个对象有时也可代替许多类
create-pop

第一种是通过类实例化对象创建的,第二种是通过创建一个新对象然后包装增强其属性和功能来实现的。他们之间的差异性也造成前面通过类创建的对象,如果这些类继承同一父类,那么他们的父类原型上的方法是可以共用的。而后面寄生方式创建的对象都是一个新的个体,所以他们的方法就不能共用了

工厂方法模式

安全模式类:可以屏蔽使用这对类的错误使用造成的错误
safe-model-class
safe-factory-model

抽象工厂模式

抽象工厂模式(Abstract Factory):通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例

(1)抽象类
抽象类是一种声明但不能使用的类
abstract-car
创建的这个car类其实什么都不能做,创建时没有任何属性,然而原型prototype上的方法也不能使用,否则会报错。但在继承上却是很有用的,因为定义了一种类,并定义了该类所必备的方法,如果在子类中没有重写这些方法,那么当调用时能找到这些方法便会报错。这一特点是很有必要的,因为在一些大型应用中,总会有一些子类去继承另一些父类,这些父类经常会定义一些必要的方法,却没有具体的实现,如 car类中的 getPrice()和getSpeed()方法,那么一旦用子类创建了一个对象,该对象总是应该具备一些必要的方法,但如果这些必要的方法从父类中继承过来而没有具体去重写实现,那么实例化对象便会调用父类
中的这些方法,如果父类能有一个友好提示,那么对于忘记重写子类的这些错误遗漏的避免是很有帮助的。这也是抽象类的一个作用,即定义一个产品簇,并声明一些必备的方法,如果子类中没有去重写就会抛出错误。

(2)抽象工厂模式:一般用它来作为父类创建一些子类
abstract-factory1
abstract-factory2
抽象工厂其实是一个实现子类继承父类的方法,在这个方法中需要通过传递子类以及要继承父类(抽象类)的名称,并且在抽象工厂方法中又增加了一次对抽象类存在性的一次判断,如果存在,则将子类继承父类的方法。然后子类通过寄生式继承。继承父类过程中有一个地方需要注意,就是在对过渡类的原型继承时,不是继承父类的原型,而是通过new关键字复制的父类的一个实例,这么做是因为过渡类不应仅仅继承父类的原型方法,还要继承父类的对象属性,所以要通过new关键字将父类的构造函数执行一遍来复制构造函数中的属性和方法。对抽象工厂添加抽象类也很特殊,因为抽象工厂是个方法不需要实例化对象,故只需要一份,因此直接为抽象工厂添加类的属性即可,于是就可以通过点语法在抽象工厂上添加需要的三个汽车簇抽象类Car、Bus、Truck
abstract-factory3

建造者模式

建造者模式(Builder):将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示

工厂模式主要是为了创建对象实例或者类簇(抽象工厂),关心的是最终产出(创建)的是什么。不关心你创建的整个过程,仅仅需要知道你最终创建的结果。所以通过工厂模式我们得到的都是对象实例或者类簇。
建造者模式在创建对象时要更为复杂一些,虽然其目的也是为了创建对象,但是它更多关心的是创建这个对象的整个过程,甚至于创建对象的每一个细节
human
name
work
person

工厂模式创建出来的是一个对象,它追求的是创建的结果
建造者模式不仅仅可得到创建的结果,也参与了创建的具体过程,对于创建的具体实现的细节也参与了干涉,这种模式创建的对象是一个复合对象

注意:这种方式对于整体对象类的拆分无形中增加了结构的复杂性,因此如果对象粒度很小,或者模块间的复用率很低并且变动不大,最好还是创建整体对象

原型模式

原型模式(Prototype):用原型实例指向创建对象的类,使用于创建新的对象的类共享原型对象的属性以及方法

原型模式就是将可复用的、可共享的、耗时大的从基类中提出来然后放在其原型中,然后子类通过组合继承或者寄生组合式继承而将方法和属性继承下来,对于子类中那些需要重写的方法进行重写,这样子类创建的对象既具有子类的属性和方法也共享了基类的原型方法
prototype-model
原型模式有一个特点就是在任何时候都可以对基类或者子类进行方法的拓展,而且所有被实例化的对象或者类都能获取这些方法

(1)原型继承
原型模式更多的是用在对对象的创建上。比如创建一个实例对象的构造函数比较复杂,或者耗时比较长,或者通过创建多个对象来实现。此时最好不要用new关键字去复制这些基类,但可以通过对这些对象属性或者方法进行复制来实现创建,这是原型模式的最初思想。如果涉及多个对象,也可以通过原型模式来实现对新对象的创建。那么首先要有一个原型模式的对象复制方法
prototype-inherit1
prototype-inherit2

原型对象更适合在创建复杂的对象时,对于那些需求一直在变化而导致对象结构不停地改变时,将那些比较稳定的属性与方法共用而提取的继承的实现

单例模式

单例模式(Singleton):又被称为单体模式,是只允许实例化一次的对象类。有时我们也用一个对象来规划一个命名空间,井井有条地管理对象上的属性与方法

(1)命名空间
命名空间就是人们所说的namespace,有人也叫它名称空间。
它解决这么一类问题:为了让代码更易懂,人们常常用单词或者拼音定义变量或者方法,但由于人们可用的单词或者汉字拼音是有限的,所以不同的人定义的变量使用的单词名称很有可能重复,此时就需要用命名空间来约束每个人定义的变量来解决这类问题

(2)静态变量
static-param

(3)惰性单例
lazy-single-instance

评论