文章目录
1. UML
1.1 UML中的关系
主要4种:
- 关联关系(association)
- 依赖关系(dependency)
- 实现关系(realization)
- 泛化关系(generalization)
1.2 用例图
从客户角度描述功能,包括:
- 参与者(actor),画个小人
- 用例(use case),椭圆,代表功能
- 关系,小人指向功能
1.2.1 泛化关系(generalization)
即虚函数,如支付方式分为微信、支付宝。 会员用户继承自普通用户。用空心箭头指向父类。
1.2.2 包含关系(include)
如添加、修改、删除数据均需包含更新数据库功能。
1.2.3 扩展关系(extend)
偶尔执行其它可选功能,如保存成绩后想打印出来。
1.3 类图
主要元素:类、接口、关系。 关系 即4大关系。 类图中也有包含和约束。
由类名、属性和方法组成。加号public,减号private,井号protected。
1.3.1 关联关系
比如,人拥有(实线指向)车,用小箭头(->)。
1.3.2 聚合关系
更强的关联关系,如汽车和引擎,引擎指向车,空心菱形在车一端。
1.3.3 关联-组合
如公司和部门,空心菱形改实心。
2. 设计模式
目前分类:GoF的23种+简单工厂模式 == 24种
2.1 OOP设计原则
可维护,可复用,目的是高内聚低耦合。
- 单一职责原则,single responsibility principle,对外只提供一个功能,引起类变化的原因只有一个;
- 开闭原则,open-closed principle,类的改动通过增加代码进行,而不是修改源码,且不影响旧代码;
- 里氏代换原则,Liskov substitution principle,任何抽象类出现的地方都能由实现类替换;
- 依赖倒转原则,dependence inversion principle,面向接口编程,不要依赖实现类,也就是中间层是抽象的,如doBusiness(AbstractBankWorker *p);
- 接口隔离原则,interface segragation principle,一个接口只提供一种功能,不要封装太多功能;
- 合成复用原则,composite reuse principle,父类变化会影响子类,所以对于继承和组合,后者优先,比如人不应继承车,而是拥有抽象车类指针成员;
- 迪米特法则,law of Demeter(LoD),一个对象不应了解另一个对象,即提供接口,低耦合,黑盒原理。又叫最少知识原则,比如买房需要中介。
3. 创建型模式
3.1 简单工厂模式、工厂方法模式、抽象工厂模式
情景:不想new(繁琐),而是直接用,且类很少。所以给工厂CreateObject传参,返回需要的对象。
缺点:
- 不符合开闭原则
- 功能过多
为了符合产品族开闭原则,可以引入抽象工厂,每个具体工厂生产一个类,如苹果厂,香蕉厂。这叫做工厂方法模式,适用于客户不需要知道所需对象的情况。
缺点:类会越来越多,不好维护。
工厂方法模式可以增加产品等级,抽象工厂模式则是针对产品族。
- 产品族:同一工厂的产品,比如增加一个中国水果工厂,且并不需要改变抽象工厂;
- 产品等级:不同工厂的产品,如增加香蕉则要在抽象工厂中增加CreateBanana,不符合开闭原则。
3.2 单例模式
一般用于管理者对象。
步骤:
- 构造函数私有
- 静态私有类指针
- 静态GetInstance()
单例模式不用考虑释放问题
// 懒汉式
class Singleton_lazy
{
private:
Singleton_lazy() {}
static Singleton_lazy* GetInstance()
{
if (pSingleton == NULL)
{
pSingleton = new Singleton_lazy;
}
return pSingleton;
}
private:
static Singleton_lazy* pSingleton;
};
Singleton_lazy* Singleton_lazy::pSingleton = NULL;
// 饿汉式
class Singleton_hungry
{
private:
Singleton_hungry() {}
static Singleton_hungry* GetInstance()
{
return pSingleton;
}
private:
static Singleton_hungry* pSingleton;
};
Singleton_hungry* Singleton_hungry::pSingleton = new Singleton_hungry;
多线程问题
懒汉式遇到多线程是不安全的,可能多次new。所以要用饿汉式。