设计模式1-创建型模式

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 单例模式

一般用于管理者对象。

步骤:

  1. 构造函数私有
  2. 静态私有类指针
  3. 静态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。所以要用饿汉式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值