首页 > 代码库 > 工厂方法模式和Effective C++学习日记
工厂方法模式和Effective C++学习日记
简单工厂模式VS工厂方法模式:
简单工厂模式:最大优点在于工厂类中必须包含必要的逻辑判断,根据客户端选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现相应的类,选择判断的问题还是存在的,也就是说,工厂方法模式把简单工厂的内部逻辑判断移动了客户端代码来进行。想要加功能,在简单工厂模式中,需要改工厂类,而若使用工厂方法模式,需要改客户端。
Effective C++:
1:别让异常逃离析构函数
(1),析构函数绝对不能吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数必须捕捉任何异常,然后吞下他们或者结束程序。
(2),如果客户需要对某个操作函数运行期间抛出的异常进行反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。
2:决不在构造或者析构函数中调用virtual函数
(1),在构造或者析构中绝不要调用virtual函数,因为这类调用绝不下降到derived class(比起当前执行构造和析构的类)
3:另Oprerate=返回一个Reference to *this
4:在Operate=中处理“自我赋值”
(1),确保当对象自我赋值时 operate= 有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。
(2),确定任何函数操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。
5:复制对象时勿忘记base class 中的成分
(1),Copying 函数应该确保复制”对象内所有成员变量“以及”所有 base class 成分"。
(2),不要尝试以某个 copying 函数实现另一个 copying 函数。应该将共同技能放进第三个函数中,并由两个 copying 函数共同调用。
6:以对象管理资源
(1),为了防止资源泄露,请使用RAII (Resource Acquisition Is Initialization)对象,他们在构造函数中获取资源并在析构函数中释放资源。
(2),两个常被使用的RAII classes 分别是 tr1::shared_ptr 和 auto_ptr 。前者通常是较佳选择,因为其 copy 行为比较直观。若选择 auto_ptr ,复制动作会使它指向NULL。
7:在资源管理类中小心 copying 行为
(1),复制 RAII 对象必须一并复制它所管理的资源,所以资源的 copying 行为决定 RAAI 对象的 copying 行为。
(2),普遍而常见的 RAAI class copying 行为是:抑制 copying、施行引用计数器法(reference counting)。不过其他行为也都可能被实现。