创建型模式(5种) |
单例模式 |
特点:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用场景:
1.当类只有一个实例而且客户可以从一个众所周知的访问点访问它时。
2.当这个唯一实例应该是通过子类可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。
优点:
1,单例模式提供了对唯一实例的访问2,在系统内存中只存在一个对象,所以可以节约系统资源
缺点:单例扩展有较大困难
工厂方法模式 |
特点:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。
适用场景:
1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类时代理着只一个信息局部化的时候。
优点:
1,工厂方法来创建客户所需要的产品,而客户只需要关心所需产品对应的工厂即可,不需要关心创建细节,甚至不需要知道具体产品类的类名
2,能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节,完全封装在具体工厂内部。
3,当系统需要加入新产品时,无须修改抽象工厂或抽象产品提供的接口,不需要修改客户端,也不需要修改其他具体的工厂和产品,只需要再添加一个新的具体工厂和产品就OK。使得系统的可扩展性变得很好,符合“开放-封闭”原则
缺点:
在添加新产品时,需要编写新的类,还要添加与之对应的具体工厂类,在一定程度上增加了
抽象工厂模式 |
特点:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
适用场景:
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当提供一个产品类库,只想显示它们的接口而不是实现时。
优点:
抽象工厂,顾名思义就是对于客户来说,它是抽象的,也就是客户不需要知道什么被创建,从而可以减少客户端与具体产品类之间的依赖,进而使得系统的耦合度降低,使得后期的维护和扩展更加方便。
缺点:
很难支持新产品的变化。因为在抽象接口中已经确定了可以被创建的产品集合,如果需要添加新的产品,就需要更改抽象工厂的接口,这样就涉及到了抽象工厂的类及其所有子类的改变,也就违背了“开放-关闭”的原则
建造者模式 |
特点:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
适用场景:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须允许被构造的对象有不同的表示时。
优点:
1,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2, 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。符合“开放-封闭”原则
3, 可以更加精细地控制产品的创建过程
缺点:
1, 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适合使用建造者模式,因此其使用范围受到一定的限制。
2,如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本
原型模式 |
特点:使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。
适用场景:
1.当一个系统应该独立于饿啊的产品创建、构成和表示时。
2.当要实例化的类时在运行时刻指定时,例如动态装载。
3.为了避免创建一个与产品类层次平行的工厂类层次时。
4. 当一个类的实例只能有几个不同状态组合中的一种时。建立响应数目的原型并克隆它们可能比每次有合适的状态手工实例化该类更方便一些。
优点:
1,当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程
2,扩展性较好
缺点:
1,需要为每一个类配备一个克隆方法