• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

LUAOOP单例模式实现的一个方案

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

存在这么一类class, 无论class怎么初始化, 产生的instance都是同一个对象。

 

Code

string.toHTMLCode = function(self)

    return encodeHTML(self)

end

-- Instantiates a class

local function _instantiate(class, ...)

    -- 单例模式,如果实例已经生成,则直接返回

    if rawget(class, "__singleton") then

        -- _G[class]值为本class的实例

        if _G[class] then

            return _G[class]

        end

    end

    local inst = setmetatable({__class=class}, {__index = class})

    if inst.__init__ then

        inst:__init__(...)

    end

    --单例模式,如果实例未生成,则将实例记录到类中

    if rawget(class, "__singleton") then

        if not _G[class] then

            _G[class] = inst

        end

    end

    return inst

end

-- LUA类构造函数

local function class(base)

    local metatable = {

        __call = _instantiate,

        __index = base

    }

    -- __parent 属性缓存父类,便于子类索引父类方法

    local _class = {__parent = base}

    -- 在class对象中记录 metatable ,以便重载 metatable.__index

    _class.__metatable = metatable

    return setmetatable(_class, metatable)

end

 

---- code lua format ------

-- Instantiates a class
local function _instantiate(class, ...)
    -- 抽象类不能实例化
    if rawget(class, "__abstract") then
        error("asbtract class cannot be instantiated.")
    end

    -- 单例模式,如果实例已经生成,则直接返回
    if rawget(class, "__singleton") then
        -- _G[class]值为本class的实例
        if _G[class] then
            return _G[class]
        end
    end

    local inst = setmetatable({__class=class}, {__index = class})
    if inst.__init__ then
        inst:__init__(...)
    end

    --单例模式,如果实例未生成,则将实例记录到类中
    if rawget(class, "__singleton") then
        if not _G[class] then
            _G[class] = inst

            -- 对类对象增加实例获取接口
            class.getInstance = function ( self )
                return _G[class]
            end
            -- 对类对象增加实例销毁
            class.destroyInstance = function ( self )
                return _G[class]
            end
        end
    end

    return inst
end

-- LUA类构造函数
local function class(base)
    local metatable = {
        __call = _instantiate,
        __index = base
    }

    -- __parent 属性缓存父类,便于子类索引父类方法
    local _class = {__parent = base}

    -- 在class对象中记录 metatable ,以便重载 metatable.__index
    _class.__metatable = metatable

    return setmetatable(_class, metatable)
end

--- Test whether the given object is an instance of the given class.
-- @param object Object instance
-- @param class Class object to test against
-- @return Boolean indicating whether the object is an instance
-- @see class
-- @see clone
function instanceof(object, class)
    local meta = getmetatable(object)
    while meta and meta.__index do
        if meta.__index == class then
            return true
        end
        meta = getmetatable(meta.__index)
    end

    return false
end

 

 

使用说明:

使用方法, class继承方式不变

如果给定义的class设置一个 _singleton 为 true, 开启单利模式。

Dmenu = class() -- 菜单类
Dmenu.__singleton = true -- 开启单例模式

 

使用类创建实例:

local menu = Dmenu()
if Dmenu:getInstance() == menu then
print("true")
end

Dmenu:destroyInstance()
menu:destroyInstance()

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua实现List及Dictionary发布时间:2022-07-22
下一篇:
Quick-Cocos2d-x使用tolua工具导出C++的类给Lua调用发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap