zoukankan      html  css  js  c++  java
  • 设计模式--创建型模式

    简介

    创建型模式,顾名思义,就是当你实例化一个对象时所采用的设计模式。

    Abstarct Factory - 抽象工厂

    抽象工厂用于创建一系列相关的对象。

    Builder - 生成器

    生成器用于创建复杂的对象,一步步的创建对象的一部步,然后进行返回。

    Factory Method - 工厂方法

    工厂方法实现在使用者的内部,不像前两种方法是传入参数,然后使用参数进行构建。

    Prototype - 原型

    原型可以传递给使用者一个例子指针,使用者使用指针对象的clone操作来创建新的对象,适用于写框架。

    Singleton - 单件

    单件也叫单例,很常用的模式。有一种可以特别注意下:单例基类并不用来实例化,用来保存一个单例实例列表,这样可以实例化多种单例,用参数来读取。见代码。
    singleton.h

    #pragma once
    
    #include <string>
    #include <unordered_map>
    #include <iostream>
    
    using namespace std;
    
    class Singleton
    {
    public:
        static Singleton* Instance(const string& name);
    
        void Register(const string& name, Singleton* p);
    
        virtual string Name() { return typeid(*this).name(); }
    
    protected:
        Singleton() { cout << "Singleton" << endl; }
    
        static Singleton* LookUp(const string& name);
    
    private:
        static unordered_map<string, Singleton*> _list;
    };
    
    

    singleton.cpp

    #include "singleton.h"
    
    unordered_map<string, Singleton*> Singleton::_list;
    
    Singleton* Singleton::Instance(const string& name)
    {
        return LookUp(name);
    }
    
    void Singleton::Register(const string& name, Singleton* p)
    {
        _list[name] = p;
    }
    
    Singleton* Singleton::LookUp(const string& name)
    {
        if (_list.find(name) == _list.end())
            return nullptr;
        return _list[name];
    }
    
    

    singleton1.h

    #pragma once
    
    #include <iostream>
    
    #include "singleton.h"
    
    class Singletion1 final
        : public Singleton
    {
    private:
        Singletion1()
        {
            std::cout << "1" << std::endl;
            Register("1", this);
        }
    
    private:
        static Singletion1* _instance;
    };
    
    

    singleton1.cpp

    #include "singleton1.h"
    
    Singletion1* Singletion1::_instance = new Singletion1();
    
    

    singleton2.h

    #pragma once
    
    #include <iostream>
    
    #include "singleton.h"
    
    class Singletion2 final
        : public Singleton
    {
    public:
        Singletion2()
        {
            std::cout << "2" << std::endl;
            Register("2", this);
        }
    };
    
    static Singletion2 _instance;
    
    

    main.cpp

    #include <iostream>
    #include <vector>
    
    #include "singleton.h"
    
    using namespace std;
    
    int main()
    {
        vector<string> name_list{ "1", "2" };
    
        for (const auto& name : name_list)
        {
            cout << "
    ----------------------------------
    ";
            cout << name << endl;
            auto p = Singleton::Instance(name);
            if (p)
            {
                cout << p->Name() << endl;
            }
            else
            {
                cout << "fail" << endl;
            }
        }
    }
    
    

    以上代码中,singleton1和singleton2是以两种不同的方式进行初始化的,各有利弊,可以看情况来选择适合的方式。

  • 相关阅读:
    java架构解密——实时动态aop
    guice基本使用,配置模块的两种方式(三)
    guice基本使用,三种注入方式(二)
    guice的基本使用(一)
    Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
    java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
    java泛型(一)、泛型的基本介绍和使用
    java泛型学习(2)
    jquery,从后台查数据,给页面上添加树形。
    Java Annotation认知(包括框架图、详细介绍、示例说明)
  • 原文地址:https://www.cnblogs.com/RookieSuperman/p/14801383.html
Copyright © 2011-2022 走看看