LUA OOP 单例模式实现的 一个 方案

单例

存在这么一类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

说明:

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

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

时间: 2024-10-09 20:37:00

LUA OOP 单例模式实现的 一个 方案的相关文章

[Lua]实现switch的一种方案

Lua实现switch的一种方案 if ... elseif ... end 形式 local ET_CASE_ONE = 1 local ET_CASE_TWO = 2 local function do_case_one( ... ) print("do_case_one") end local function do_case_two( ... ) print("do_case_two") end local function do_default() pri

设计模式第六讲:单例模式(附优化方案)

单例模式 一:模式定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 二:模式特点 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源. 三:使用场景 希望在系统中某个类的对象只能存在一个. 四:具体实现 单例模式有两种写法: 1.懒汉式 2.饿汉式 懒汉式实现: public class Single { private static Single instance; private Singleton (){} public

lua OOP实现对象的链式调用

数学中的链式法则 http://sx.zxxk.com/ArticleInfo.aspx?InfoID=164649 链式微分法则:实数运算的链式法则:对数运算的链式法则:平行公理的链式法则:向量运算的链式法则: JS对象链式调用方法 http://stackoverflow.com/questions/15029309/how-to-write-jquery-chainable-functions-for-local-usinghttp://stackoverflow.com/question

“六神”——技术提高开发效率的一个方案

这个方案并不是我在系统设计方面的最早一次尝试.但它在提高开发效率方面,是效果最为显著的一个方案. 简介 "六神"框架提供了一套简单而通用的.从Web层到数据库操作(增加单个数据.删除单个数据.修改单个数据.查询单个数据.查分页列表.查不分页列表,六个操作,因此名为"六神")的基础组件.并且,它为复杂的数据库操作留下了扩展点. 在当时的技术背景下,这套框架使用Struts2.0+Spring+myBatis来实现.但是它的设计思路是可以适用于其它技术的. 在应用了这套

LUA OOP编程实现方法

lua原生不支持OOP特性 确实如此, 同时可以采用其它lua代码的方式实现OOP的特性. OOP四大特性 抽象 封装 继承 多态 http://www.cnblogs.com/xiaosongluffy/p/5072501.html 四大基本特性: 抽象:提取现实世界中某事物的关键特性,为该事物构建模型的过程.对同一事物在不同的需求下,需要提取的特性可能不一样.得到的抽象模型中一般包含:属性(数据)和操作(行为).这个抽象模型我们称之为类.对类进行实例化得到对象. 封装:封装可以使类具有独立性

一个lua文件如何调用另一个lua文件的变量?

进来在学习春哥的OpenResty,个人对lua也不怎么熟练,难免会碰到很多奇奇怪怪的问题,这里就稍微记录下碰到的一些小问题,以供他人参考. 上网搜相关资料,大多数资料都只是说调用lua的require或者dofile,并且详细说命它们的区别,不是说没用,只是没有回答我的问题--如何在OpenResty服务器上,实现lua文件之间的变量互用? 首先,得要指定require的路径,需要在http段里面配置变量"lua_package_path /topath/?.lua;;",注意这里的

Lua自己实现深度克隆一个值

深度克隆一个值 ~~~ lua -- 下面的代码,t2 是 t1 的引用,修改 t2 的属性时,t1 的内容也会发生变化 local t1 = {a = 1, b = 2} local t2 = t1 t2.b = 3    -- t1 = {a = 1, b = 3} <-- t1.b 发生变化 -- clone() 返回 t1 的副本,修改 t2 不会影响 t1 local t1 = {a = 1, b = 2} local t2 = clone(t1) t2.b = 3    -- t1

Lua:Nginx Lua环境配置,第一个Nginx Lua代码

一.编译安装LuaJIT Lua:编译安装LuaJIT,第一个Lua程序 http://blog.csdn.net/guowenyan001/article/details/48250427 二.下载NDK与Lua_module 2.1 下载NDK,解压缩 wget -c https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gz tar zxvf v0.2.18 2.2 下载Lua_module,解压缩 wget -c https

初步解决博客园代码高亮的一个方案

今天我要推荐的是一个免费而且支持markdown语法的软件--Typora 它有很多优点,支持多种类型代码的高亮风格,方便的排版处理,支持Latex等,最重要的一点是真正做到了所见即所得ヽ(???)?(???)? 之前在csdn 的时候有markdown编辑器,是左半边写,右半边就可以预览.但Typora厉害就在于它只有一个界面,写好之后就可以直接显示效果了(除了少数的功能无法直接预览,就我所知比如居中处理),这一点就很棒了 写前两篇博客的时候感叹博客园的markdown编辑器真是太难用了,而且