• 设计模式 第二天 工厂方法模式、抽象工厂方法模式、单例模式、代理模式


    1 昨日回顾

    继承的耦合度是最高的 因为有父类的完全方法

    比聚合还高

    2 工厂方法模式(从这里开始就是GOF讲的23种设计模式中的内容了

    简单工厂模式违背了开闭原则,

    对简单的工厂模式进行改造:

    工厂方法模式:

    抽象的工厂类:

    Main函数:

    发生了两次多态:

     

    3 抽象工厂方法模式

     

    1.添加一个产品族,测试:

    2.添加一个产品等级结构

    (在添加鸭梨生成器的时候修改了抽象工厂 已经违背了开闭原则了)

    结论: 针对产品族进行添加 符合开闭原则

         针对产品等级结构添加 不符合开闭原则

    4 抽象工厂方法模式和工厂三兄弟总结

     

     

    5 单例模式的任务管理器

    如果对象是全局唯一的 那么就说它是一个单例

    Windows下任务管理器就是单例的 怎么打开都是一个

    内部的数据是向操作系统内核发请求得到的

    1. 如果任务管理器有多个 不停的发请求 会出现 同一时刻 不同的系统参数会给用户带来歧义
    2. Windows操作系统就给任务管理器类设置为单例类,全局唯一。

    6 单例模式

     

    饿汉式: 在编译时候确定单例对象

    懒汉式: 在调用的时候才确定单例对象

    当懒汉式遇见多线程

     

    多线程情况:

    如果a可能回是func1 和func2的竞争资源

    应该使用锁 调用前查看是否被锁

    使用锁。

    #define _CRT_SECURE_NO_WARNINGS

    #include <iostream>

     

    using namespace std;

     

     

     

    /*

      一是某个类只能有一个实例

      二是它必须自行创建这个实例

      三是它必须自行向整个系统提供这个实例

    */

     

     

     

    /*

    单例模式的使用步骤:

     

    a) 构造函数私有化。 //为了不让在类的外部再创建一个本类的实例。

    b) 提供一个全局的静态方法(全局访问点)来获取单例对象。

    c) 再类中定义一个静态指针 指向奔雷的变量的静态变量指针。

     

    */

     

    class Singleton

    {

    public:

        static Singleton * getInstance() {

            return instance;

        }

    private:

        // 不让类的外部再创建实例

        Singleton() {

     

        }

        static Singleton * instance; // 指向本类唯一实例的指针

    };

     

     

     

    /*

        饿汉式 - 在编译期间就已经确定这个唯一的实例了。

    */

    // 给静态成员赋值

    Singleton * Singleton::instance = new Singleton(); // 类的内部

     

     

    class Singleton2

    {

    public:

        static Singleton2* getInstance()

        {

            if (instance == NULL) {

                instance = new Singleton2;

            }

     

            return instance;

        }

    private:

        Singleton2() {

     

        }

        static Singleton2 *instance;

    };

     

    // 懒汉式的初始化方式

    Singleton2 * Singleton2::instance = NULL;

     

     

    int main(void)

    {

        Singleton * s1 = Singleton::getInstance();

        Singleton * s2 = Singleton::getInstance();

     

            if (s1 == s2) {

                cout << "s1 == s2" << endl;

            }

            else {

                cout << "s1 != s2" << endl;

            }

     

            Singleton2 *s3 = Singleton2::getInstance();

            Singleton2 *s4 = Singleton2::getInstance();

     

            if (s3 == s4) {

                cout << "s3 == s4" << endl;

            }

            else {

                cout << "s3 != s4" << endl;

            }

     

     

            system("pause");

        return 0;

    }

    7 单例模式-打印机案例

    #define _CRT_SECURE_NO_WARNINGS

    #include <iostream>

    #include <string>

     

    using namespace std;

     

    class Printer

    {

    public:

        static Printer * getInstance() {

            return instance;

        }

        void print(string text)

        {

            cout << "打印的内容是" << text << endl;

            sequence++;

            cout << "今天已经打印了" << sequence << "条数据" << endl;

        }

     

        static int GetCnt() {

            return sequence;

        }

     

    private:

        Printer() {

     

        }

     

        // 垃圾回收工

        class Garbo {

        private:

            ~Garbo() {

                if (instance != NULL) {

                    delete instance;

                }

            }

     

        };

     

        static Garbo garbo;  // 在静态区域开辟一个对象,Garbo

        // (静态成员在编译的时候就会在静态区开辟 当程序执行完毕的时候 在静态区开辟的内存会开始释放)

     

        static int sequence; // 记录打印机已经打印了多少条数据

        static Printer * instance;

    };

     

     

    int Printer::sequence = 0;

     

    // 饿汉式

    Printer * Printer::instance = new Printer;

    Printer::Garbo Printer::garbo;

    // 静态成员在编译的时候就会在静态区开辟 当程序执行完毕的时候 在静态区开辟的内存会开始释放 析构函数中就把instance给删除了

     

     

     

     

     

    int main(void)

    {

     

        // 员工1 获取

        Printer *p1 = Printer::getInstance(); // 获取到唯一的打印机实例

        p1->print("一份简历");

     

        Printer *p2 = Printer::getInstance();

        p2->print("lol 皮肤");

     

        Printer *p3 = Printer::getInstance();

        p3->print("离职申请");

     

     

        system("pause");

        return 0;

    }

     

    服务器中一般把线程池设计为单例

    掌握所有线程

    日志模块

    8 代理模式

     

    9 代理模式案例

    #define _CRT_SECURE_NO_WARNINGS

    #include <iostream>

    #include <string>

     

    using namespace std;

     

     

     

     

     

    // 商品

    class Item

    {

    public:

        Item(string kind, bool fact)

        {

            this->kind = kind;

            this->fact = fact;

        }

        string getKind()

        {

            return this->kind;

        }

        bool getFact()

        {

            return this->fact;

        }

    private:

        string kind; // 商品的种类

        bool fact; // 商品的真假

    };

     

     

     

     

     

    // 抽象的购物方式

    class Shopping {

    public:

        virtual void buy(Item *it) = 0; // 抽象的买东西方法

    };

     

     

     

     

    // 韩国购物

    class KoreaShopping:public Shopping {

    public:

        virtual void buy(Item *it) {

            cout << "去韩国买了" << it->getKind() << endl;

        }

    };

     

     

     

     

    // 美国购物

    class USAShopping :public Shopping

    {

    public:

        virtual void buy(Item *it)

        {

            cout << "去美国买了" << it->getKind() << endl;

        }

    };

     

     

    // 海外代理

    class OverseasProxy : public Shopping {

    public:

        OverseasProxy(Shopping * shopping)

        {

            this->shopping = shopping;

        }

        virtual void buy(Item *it) {

     

            // 1 辨别商品的真假

            // 2 进行购买()

            // 3 通过海关安检,带回祖国

     

            if (it->getFact() == true)

            {

                cout << " 1 发现正品 要购买" << endl;

     

                // 用传递进来的购物方式去购物

                shopping->buy(it);

     

                // 3 安检

                cout << "2 通过海关安检, 带回祖国" << endl;

            }

            else {

                cout << " 1 发现假货,不会购买" << endl;

            }

           

            shopping->buy(it);

            // ...

        }

    private:

        Shopping *shopping; // 有一个购物方式

    };

     

     

    int main(void)

    {

        // 1 辨别商品的真假

        // 2 进行购买()

        // 3 通过海关安检,带回祖国

     

        Item it1("nike鞋",true);

        Item it2("CET4证书", false);

     

    #if 0

        // 想去韩国买一个鞋

        Shopping *koreaShopping = new KoreaShopping;

     

        // 1 辨别商品的真伪

        if (it1.getFact() == true) {

            cout << "1 发现正品,要购物" << endl;

     

            // 2 去韩国买了这个商品

            koreaShopping->buy(&it1);

     

            // 3 安检

            cout << "2 通过海关安检, 带回祖国" << endl;

     

        }

        else {

            cout << "3 发现假货,不会购买" << endl;

        }

    #endif

     

     

        // 使用代理的方式

        Shopping *usaShopping = new USAShopping;

        Shopping *OverseaProxy = new OverseasProxy(usaShopping);

     

     

        OverseaProxy->buy( &it1);

     

     

        system("pause");

     

        return 0;

    }

    9 代理模式案例

    #define _CRT_SECURE_NO_WARNINGS

    #include <iostream>

     

    using namespace std;

     

    class BeautyGirl

    {

     

    public:

        // 1 跟男人抛媚眼

        virtual void MakeEyesWithMan() = 0;

        // 2 与男人共度美好的约会

        virtual void HappyWithMan() = 0;

    };

     

     

    // 潘金莲

    class JinLian :public BeautyGirl

    {

    public:

        // 1 跟男人抛媚眼

        virtual void MakeEyesWithMan()

        {

            cout << "潘金莲抛了一个媚眼" << endl;

        }

        // 2 与男人共度美好的约会

        virtual void HappyWithMan()

        {

            cout << "潘金莲跟你共度约会" << endl;

        }

     

    private:

     

    };

     

    class WangPo :public BeautyGirl

    {

    public:

        WangPo(BeautyGirl* girl) {

            this->girl = girl;

        }

     

        // 1 跟男人抛媚眼

        virtual void MakeEyesWithMan() {

            girl->MakeEyesWithMan();

        }

        // 2 与男人共度美好的约会

        virtual void HappyWithMan() {

            girl->HappyWithMan();

        }

    private:

        BeautyGirl* girl;

    };

     

     

    // 西门大官人

    int main(void)

    {

        BeautyGirl *jinlian = new JinLian;

     

        WangPo * wangpo = new WangPo(jinlian);

     

       

        // 想让潘金莲抛一个

        wangpo->MakeEyesWithMan();

        // 让金莲约个会

        wangpo->HappyWithMan();

     

        return 0;

    }}

    代理:

    class Proxy: public BaseClass

    {

        public:

            Proxy(BaseClass * obj)

               {

                       this.obj = obj

               }

               virtual void ....

               virtual void ....

           

        private:

          Baseclass * obj

    }

  • 相关阅读:
    2015-12-25-(菜单栏的效果)
    2015-12-23-(实现左边题目,右边内容的效果)
    2015-12-23-( dispaly:table的用法)
    2015-12-21(box-sizing:border-box)
    闭包
    js中this的用法
    jQuery或Angular实现弹出框单击显示,双击隐藏
    jQuery 点击任意处隐藏,除某个元素外
    导航栏滚动到顶部后固定
    h5 audio标签在手机上不能自动播放????
  • 原文地址:https://www.cnblogs.com/eret9616/p/10705567.html
Copyright © 2020-2023  润新知