享元模式lua实现

--[[
	设计模式中的享元模式,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).
	它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。
	抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。

	具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。

	享元工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

]]--

FlyweightFactory = {}

function FlyweightFactory:new(o)
	o = o or {}
	setmetatable(o,self)
	self.__index = self
	o.flyweight = {}
	o.flyweight["male"] = ConcreteFlyweight1:new()
	o.flyweight["female"] = ConcreteFlyweight2:new()
	return o;
end

function FlyweightFactory:GetFlyweight(key)
	if key ~= nil then
		return self.flyweight[key]
	end
end

Flyweight = {}

function Flyweight:new(o)
	o = o or {}
	setmetatable(o,self)
	self.__index = self	
	return o
end

function Flyweight:Operation()
	print("base operation")
end

function Flyweight:SetName(n)
	self.name = n
	return self
end

ConcreteFlyweight1 = Flyweight:new()

function ConcreteFlyweight1:Operation(state)
	print(self.name.." 追求 "..state.name)
end	

ConcreteFlyweight2 = Flyweight:new()

function ConcreteFlyweight2:Operation(state)
	print(self.name.." 喜欢 "..state.name)
end

UnsharedConcreteFlyweight = Flyweight:new()

function UnsharedConcreteFlyweight:Operation(state)
	--这里是不需要共享的操作
	print(state)
end

print("月老牵红线......")

f = FlyweightFactory:new()
xietingfeng = f:GetFlyweight("male"):SetName("谢霆疯")
zhangbozhi = f:GetFlyweight("female"):SetName("张伯芝")
xietingfeng:Operation(zhangbozhi)
zhangbozhi:Operation(xietingfeng)

zhubajie = f:GetFlyweight("male"):SetName("猪八戒")
change = f:GetFlyweight("female"):SetName("嫦娥")
zhubajie:Operation(change)
change:Operation(zhubajie)

xietingfeng = UnsharedConcreteFlyweight:new()
xietingfeng:Operation("谢霆疯:我后悔了")

zhubajie = UnsharedConcreteFlyweight:new()
zhubajie:Operation("猪八戒:感谢月老")
输出结果:
月老牵红线......
谢霆疯 追求 张伯芝
张伯芝 喜欢 谢霆疯
猪八戒 追求 嫦娥
嫦娥 喜欢 猪八戒
谢霆疯:我后悔了
猪八戒:感谢月老


交流群:315249378
如有不正确,欢迎交流讨论!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值