一.6大设计原则(Solid)
类是对一类“事物”的属性与行为的抽象。
1.单一原则(Single):一个类应该职责单一,一个类只代表一种概念,一个方法只实现一个功能。
2.开闭原则:类对扩展是开放的,对修改是关闭的。
3.里氏替换原则:派生类必须能够完全替换基类。
4.依赖倒置原则:高层模块不依赖底层模块,双发都应该依赖抽象,抽象不依赖细节,细节依赖抽象;
5.接口隔离原则:类之间的依赖关系应该建立在最小的接口上;
6.迪米特原则:一个对象应该对其他的对象有最少的了解,即通俗讲外部关心的方法为publish,其他次要的都是private。
一张图学会UML:
1. 继承/泛化(Generalization)
【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性。
【箭头指向】:带三角箭头的实线,箭头指向父类
二.
三.
四.工厂模式:生成复杂对象,最终目的是解耦
适用场景:
不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,适用场景也是类似的。
首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地
方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂
模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需
要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。
再次,由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当
需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。
简单工厂模式:可以根据参数的不同返回不同类的实例;
方法工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式有四个要素:
• 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会
使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
• 工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多
少个具体的工厂实现。
• 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品
接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用
抽象类来代替,但要注意最好不要违反里氏替换原则。
• 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
场景: 当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。
抽象工厂模式的优点
除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
抽象工厂模式的缺点
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。
简单工厂模式与工厂方法模式的区别:
简单工厂只有三个要素,没有工厂接口,并且得到产品的方法一般是静态的。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱。
抽象工厂模式与工厂方法模式的区别:
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。
应用场景:
原型模式
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
原型模式的应用场景
原型模式通常适用于以下场景。
- 对象之间相同或相似,即只是个别的几个属性不同的时候。
- 对象的创建过程比较麻烦,但复制比较简单的时候。
场景:cho
参考: