有人说模式会让代码变的优雅,也有人说模式会让你的代码更利于扩展。我个人觉得这些说 的都对。但是滥用模式一样会成为被人诟病的痛点。与其说面向对象语言考察的主要标准是语法,不如考察对模式的理解更加切合实际。很大一部分人都觉得模式枯 燥无味,但其实模式是一些充满智慧的集合,可以用在任何的领域,本系列文章就是希望在一种新新的角度里看模式。《三国杀》一 直是我热衷的游戏之一,当然外界对它褒贬不一我们不作深究。我相信很少有人把模式和游戏联系起来,不过我还是愿意开这个先例,如果你觉得我的方式并不赖, 不妨跟我一起探讨,我很愿意和一些志同道合的人聊这些东西,当然不限制于任何的学科。虽然市面上关于模式的文章非常多,但是我还是愿意跟大家老生长谈一 下。这次我们说工厂模式。很多人觉得工厂模式再简单不过了,但是实际上能用的好的人往往很少,而且工厂模式也常常伴随着其他模式出现,这种复合的模式你又 是否能够掌握的很好呢?
很多人认为工厂模式的重点在与构造,但我认为工厂模式重点在于抽象。抽象你的产品比你 创造一个工厂要困难的多。其实工厂模式的存在是控制反转的一种体现。将构造和代码分离,这种实现能有效的分离实现,提高扩展性。比较传统的比喻就是100 个人吃一个产家的面包,当他们打算换一种品牌的时候。采用工厂模式我们只需要变更工厂就行,而不采用控制反转的方式就像是100个人自己去买面包。
当然你一时很难将这两种场景抽象组合起来。那么我们在说工厂模式之前我们不妨先说一下IOC(控制反转)。我们先写一段非控制反转的代码:
Bread a1 = new Bread_味多美();
假如我们买"味多美"的面包,用这种非IOC的写法,假如说我们有一百个类都采用这种写法,相当于100个人都持有这个面包,这时候我们发现”味多美“有问题。那怎么办呢?我们只能改这一百个类。所以看出问题了么?~如果面包的种类是多变的那怎么办呢?~这里我们不提工厂,只说IOC,我们将这种控制反转的集合类称为IOC容器。
Bread a = IOC.createBread();
当我们要换成其他的品牌的时候,我们只需要修改ioc容器一个类的代码即可。不知道这样大家能否跟我一样理会IOC的重要性。好的,如果你已经理解了IOC,我们回头来说一下Factory模式。
工厂主要分成简单工厂,静态工厂,万能工厂,抽象工厂。但实际上如果你理解了IOC的概念,写法这种东西没有什么重要之处,只要你觉得那种写法适合你就行。
所谓简单工厂是工厂最简单的一种写法,但是工厂本身是一个对象。静态工厂与简单工厂相对的,不需要定义工厂对象,而如果从产品种类来说的话,如果你的产品都由同一个工厂产生,那便是万能工厂。抽象工厂是对IOC之上的又一层抽象。对工厂的抽象,可以理解成是工厂的工厂。
为何我要着重讲IOC容器呢?因为很多模式都是充斥着IOC的概念,好吧~我们在三国杀这个游戏里面找找工厂模式的影子吧。
我们知道一个三国杀牌局里面有将近100多张的牌,而这些牌的产生我们就可以使用工厂模式:
Card card = CardFactory.createCrad();
我们如果只定义牌的元数据的话实际上我们可以得到这样的数据结构:
class Card{
String name; //名字
int imageHandle;//图片句柄
}
当然每一个Card都有一个效果,我们将在以后分析这种效果对象。这里我们继续回到刚才的问题,伟什么要使用工厂模式?或者说为什么要使用IOC呢?
首先,我们所看到的这个界面是不可能一成不变的。假如说我要将“桃”这个对象的某些属 性变更,比如说是图像,或者是名字,字体,说明等等。如果我们用传统new的方式改起来的工作量是非常大的。而你如果采用IOC进行反转的话,你就会发 现,只需要变更你的工厂类就可以了。当然我们这里要抛出来一些问题。一个牌局来说牌数是永远不可能增减的。那么你的牌被回收以后有没有必要重新再new出 来一张新的牌呢?~答案明显是否定的。那么这就引出另外一个模式享元模式。我将在后面跟大家说明一下这个模式,这个模式也是IOC的一种体现,大量的缓冲池代码都用到这种模式。好的我们构造了这些对象我们要对这些卡片附加一些效果。我们展示将这些效果抽象成一个Image魔法对象:
class Image {
public abstract void effect();
}
class 桃 extends Image{
public void effect() {
+1血;
}
}
我们知道对于桃这种东西来说不论是卡1还是卡2,都是一样的Image效果,那既然这样根本就没有必要对每一个卡片定义专门的效果对象。我们在card对象里面增加一个方法:
class Card{
public void addEffect(Image...images);
}
我们完全可以定义一个桃对象:
桃 t = new 桃();
然后将它放到定义好的卡片对象中去:
Card card1 = new Card(“红桃A”);
card1.addEffect(t);
card2 = new Card(“红桃K”);
card2.addEffect(t);
card3 = new Card(“红桃6”);
card3.addEffect(t);
我们可以看出这种写法不仅节省内存而且要简洁的多。这其实就是聚合模式。我也会在以后的文章中探讨它。当然桃的生成我们就可以采用工厂模式。工厂会封装 好你的对象的生成细节。我可能生成是通过数据库,代码,甚至是云端。我们看到其实三国杀里面用到的很多都是工厂模式的样例。比如英雄对象,按钮对象,牌类 对象,魔法对象,关系对象,文字对象,说明对象,装备对象。这些都是可以通过IOC容器来生成。
--非子墨
相关推荐
家里和公司轻松更换IP地址,不用重复设置!
ip自动变换 适合 各种上网用户 可以用来来做网赚
很好的Ip转换刷网站东东 真的很好用 我一直用啊 你们也一起用吧
不论采用何种方式的拨号上网,均可使用本软件自动切换IP,本软件可用来刷网站的IP流量、IP切换工具来使用,本软件具备以下功能: 1)自动拨号器:自动拨号上网,断线自动重拨,支持ADSL以及路由器等标准拨号网络;...
柳子墨 飞机大战.sb3
子墨IP变换软件 V1.0.............
CPRI帧格式详解 --子墨祭
子墨支付V7.0(安装后查看使用说明) V7.0更新内容 1.更新商户登录注册模版 2.更换商户中心模版 V6.66更新内容 1.修复登陆记录ip不显示位置bug 2.修复客户反应的已知bug V6.45更新内容 1.更加完善了3号模板 ...
北京东亚荔景园项目企划提案报告 --子墨.pptx
ZimoLoveShuang.github.io:子墨的博客
这是一款精巧的ip转换工具,可以实现在短时间内单个ip使用较长时间
点心省电是北京风灵创景科技有限公司(点心os)开发的点心系列软件,和电池监测器Battery Monitor Widget Pro类似,拥有一键优化、预设省电模式、自动校准的时间预估、耗电指数查看和状态栏显示功能,总的来说,点心...
系统功能列表里主要包括: 1.账号管理,在这里管理员可以修改个人信息,包括密码和个人资料等等。 2.用户注册管理部分是对该网站的申请注册的用户进行验证通过,管理员可以对所有用户进行删除修改和审核。 ...
第一个在嵌式培训机构写的小项目,拿出来和大家分享下,互相学习。0.0
微信小程序跳一跳游戏自动玩工具python代码 已自测可用,效果不错,分享给大家。微信跳一跳 微信小程序 跳一跳游戏 跳一跳游戏自动玩
长途汽车查询API说明文档一、 什么是长途汽车查询API长途汽车查询API是可以运行任何网站服务器的一个微型长途汽车查询系统,上传到网站服务器即可使用。本API可以运行在asp、asp.net、php、jsp等常用服务器或者虚拟...
列车时刻查询API说明文档一、 什么是列车时刻查询API列车时刻查询API是可以运行任何网站服务器的一个微型列车时刻查询系统,上传到网站服务器即可使用。本API可以运行在asp、asp.net、php、jsp等常用服务器或者虚拟...
我是子墨,来自中国,四川,成都,目前就读于成都信息工程大学。我的最新文章 我的GitHub统计信息我最常用的语言我的IDE我的编码活动 这个自述文件每小时生成一次! 最后更新:2021年2月8日星期一19:14:29 GMT
非常实用,作为摘要指导,对于要写论文发文章的同志来说会节省不少时间的,大家努力!