设计模式学习

 

软件架构设计,简单的说就是全面的模块间全面的解耦,接口应该最小化,接口对扩展开放,对修改关闭
  

1. 全面解耦原则

    对业务进行抽象建模,业务数据与业务逻辑解耦,软硬件解耦,平台和产品解耦,系统各部件解耦。模块、组件高内聚,低耦合

2. 开闭原则

    个软件实体如类、模块和函数应该对扩展开放,对修改关闭

3. 接口隔离原则

    客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上

---------------------------------------------------------------------------

设计模式:(创建型、结构型、行为型)

 

 

 

#include <iostream>

class LD_Singleton
{
public:
    static LD_Singleton* getInstance(bool value = false) {
        if(nullptr == singleton_) {
            singleton_ = new LD_Singleton(value);
        }
        return singleton_;
    }

    void setValue(bool value) {
        value_ = value;
    }

    bool getValue() {
        return value_;
    }
protected:
    static LD_Singleton* singleton_;
    static bool value_;

private:
    LD_Singleton(bool value) {
        value_ = value;
    };
    ~LD_Singleton();
};

LD_Singleton* LD_Singleton::singleton_ = nullptr;
bool LD_Singleton::value_ = false;


int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, LD_Singleton!\n";
    
    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;
    
    LD_Singleton::getInstance()->setValue(true);
    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;
    
    LD_Singleton::getInstance()->setValue(false);
    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;

    LD_Singleton::getInstance()->setValue(true);
    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;

    return 0;
}

 

一、Factory方法

定义一个用于创建对象的方法,让子类决定实例化哪一个类,Factory Method 使一个类的实例化延迟到其子类。主要用于基类中不知道它必须创建的对象的类(多个)。

     

         

 

二、抽象工厂

  提供一个创建一系列抽象对象的接口,而无需要指定它们具体的类。创建某一类产品的工厂方法实现在一个具体的工厂中,通常一个具体的工厂是一个SingleTon。

 

     优点:1)它分离了具体的类 2)它使得易于交换产品系列 3)它有利于产品的一致性

     缺点:难以支持新种类的产品 

     

三、Adapter/Wrapper

将一个类的接口转换成客户希望的另外一个接口,主要为了解决两个已有接口之间不匹配的问题。(在类已经设计好后实施,使两个已有的接口协同工作,而不是定义一个全新的接口)

      

三、 Bridge/Handle/Body

将抽象部分与它的实现部分分离,使它们都可以独立地变化,降低了对象间的耦合性。(在设计类之前实施)

     仅有一个Implementor在仅有一个实现的时候,没有必要创建一个抽象的仅有一个Implementor 类。这是Bridge模式的退化情况;

     当你希望改变一个类的实现不会影响已有的客户程序时,模式的分离机制还是非常有用的—也就是说,不必重新编译它们,仅需重新连接即可。

     在 C++中,Implementor类的类接口可以在一个私有的头文件中定义,这个文件不提供给客户。这样你就对客户彻底隐藏了一个类的实现部分。

 

 

四、Decorator/Wrapper

1. 可以动态、透明的给单个对象增加职责,避免了静态实现所有功能组合,从而导致子类急剧增加。

2. 组件、装饰器继承于一个抽象基类,装饰器类部包含一个抽象基类指针,根据需求,可以动态的传入各种不同的对象指针,可以是组件、装饰器或装饰器派生类,从而实现包装,包装可以反复迭代进行。

 

五、Facade 外观

    定义一个高层的接口,对外屏蔽内部实现,降低系统的复杂性,降低(简化)模块之间的依赖关系。

 

六、 Composite组合

    旨在构造类,使多个相关的对象能够以统一的方式处理,而多重可象可以被当作一个对象来处理,重要不在于修饰,而在于表示。

 

七、Proxy 代理

对一个对象进行访问控制的一个原因 是为了只有在我们确实需要这个对象时才对它进行创建和初始化。有远程代理、虚代理(图像)、保护代理、智能指针等工作场景。

 

八、Flyweight享元(以时间换空间)

Flyweight是一个共享对象,使得可以细粒度地使用它们而无需高昂的代价。

用两种方法来节约存储:1.用共享对象减少内部状态的存储  2. 用计算时间换取对外部状态的存储

 

九、Singleton 单例

 

#include <iostream>

 

class LD_Singleton

{

public:

    static LD_Singleton* getInstance(bool value = false) {

        if(nullptr == singleton_) {

            singleton_ = new LD_Singleton(value);

        }

        return singleton_;

    }

 

    void setValue(bool value) {

        value_ = value;

    }

 

    bool getValue() {

        return value_;

    }

protected:

    static LD_Singleton* singleton_;

    bool value_;

 

private:

    LD_Singleton(bool value) {

        value_ = value;

    };

    virtual ~LD_Singleton() {

        if(nullptr != singleton_) {

            delete singleton_;

            singleton_ = nullptr;

        }

    };

};

 

LD_Singleton* LD_Singleton::singleton_ = nullptr;

//bool LD_Singleton::value_ = false;

 

 

int main(int argc, const char * argv[]) {

    // insert code here...

    std::cout << "Hello, LD_Singleton!\n";

    

    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;

    

    LD_Singleton::getInstance()->setValue(true);

    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;

    

    LD_Singleton::getInstance()->setValue(false);

    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;

 

    LD_Singleton::getInstance()->setValue(true);

    std::cout << "LD_Singleton::value_ = " << LD_Singleton::getInstance()->getValue() << std::endl;

 

    return 0;

}

 

posted @ 2015-03-14 12:42  AndyHu518  阅读(171)  评论(0编辑  收藏  举报