有人说模式会让代码变的优雅,也有人说模式会让你的代码更利于扩展。我个人觉得这些说 的都对。但是滥用模式一样会成为被人诟病的痛点。与其说面向对象语言考察的主要标准是语法,不如考察对模式的理解更加切合实际。很大一部分人都觉得模式枯 燥无味,但其实模式是一些充满智慧的集合,可以用在任何的领域,本系列文章就是希望在一种新新的角度里看模式。《三国杀》一 直是我热衷的游戏之一,当然外界对它褒贬不一我们不作深究。我相信很少有人把模式和游戏联系起来,不过我还是愿意开这个先例,如果你觉得我的方式并不赖, 不妨跟我一起探讨,我很愿意和一些志同道合的人聊这些东西,当然不限制于任何的学科。虽然市面上关于模式的文章非常多,但是我还是愿意跟大家老生长谈一 下。这次我们说工厂模式。很多人觉得工厂模式再简单不过了,但是实际上能用的好的人往往很少,而且工厂模式也常常伴随着其他模式出现,这种复合的模式你又 是否能够掌握的很好呢?
很多人认为工厂模式的重点在与构造,但我认为工厂模式重点在于抽象。抽象你的产品比你 创造一个工厂要困难的多。其实工厂模式的存在是控制反转的一种体现。将构造和代码分离,这种实现能有效的分离实现,提高扩展性。比较传统的比喻就是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变换软件v1.0是一款专为用户设计的便捷IP地址切换工具,它能够帮助用户在家庭和工作场所之间快速、轻松地更改计算机的IP地址,避免了手动配置的繁琐过程。这款软件适用于那些需要频繁更换网络环境或者希望保护...
ip自动变换 适合 各种上网用户 可以用来来做网赚
很好的Ip转换刷网站东东 真的很好用 我一直用啊 你们也一起用吧
不论采用何种方式的拨号上网,均可使用本软件自动切换IP,本软件可用来刷网站的IP流量、IP切换工具来使用,本软件具备以下功能: 1)自动拨号器:自动拨号上网,断线自动重拨,支持ADSL以及路由器等标准拨号网络;...
柳子墨 飞机大战.sb3
子墨IP变换软件 V1.0.............
子墨支付V7.0(安装后查看使用说明) V7.0更新内容 1.更新商户登录注册模版 2.更换商户中心模版 V6.66更新内容 1.修复登陆记录ip不显示位置bug 2.修复客户反应的已知bug V6.45更新内容 1.更加完善了3号模板 ...
《子墨IP变换工具V2.0简体中文版》是一款专为用户设计的高效IP地址切换软件,尤其适用于那些需要频繁更改IP地址以实现多种网络功能或保护隐私的用户。这款工具以其简洁的界面和强大的功能,在同类产品中脱颖而出。 ...
【标题】"ZimoLoveShuang.github.io:子墨的博客" 暗示这是一个个人博客网站,由用户ZimoLoveShuang创建并托管在GitHub上。博客通常用于分享技术文章、个人见解或项目经验,因此我们可以期待这个博客中包含有关IT...
【北京东亚荔景园项目企划提案报告】是关于房地产开发的一个重要企划案,主要探讨了在北京东部地区创建一个引领新郊居生活方式的住宅项目。报告提出了几个关键概念和策略,旨在解决市场中的问题,区隔竞争对手,并...
CPRI是一种专为射频单元(Radio Equipment Controller,REC)和射频单元(Radio Equipment,RE)之间通信设计的接口标准,它定义了从物理层(Layer 1)到数据链路层(Layer 2)的协议,用于传输用户数据、控制与管理...
策略模式
概要设计阶段,晁子墨可能定义了一系列的内存管理函数,并在详细设计中实现了这些函数,包括内存分配、释放和地址转换等操作。调试分析部分,他展示了运行结果和分析,确保了内存管理的有效性和安全性。 最后,快速...
系统功能列表里主要包括: 1.账号管理,在这里管理员可以修改个人信息,包括密码和个人资料等等。 2.用户注册管理部分是对该网站的申请注册的用户进行验证通过,管理员可以对所有用户进行删除修改和审核。 ...
大数据,作为一种新兴的技术手段,已经深刻地影响了各行各业,其中包括城市管理这一重要领域。本课程的目标是让学生理解大数据的本质,掌握大数据分析方法,并能将其应用于实际的城市规划工作中。 课程资料包括PDF...
【FBX转Bip亲测可用】是一个关于3D建模和动画转换的教程资源,主要涉及如何将FBX格式的文件转换为BIP格式,适用于3Dmax软件。FBX(Filmbox)是一种跨平台的3D模型交换格式,广泛应用于各种3D软件之间,如Maya、3Dmax...
标题中的“最新12864LCD菜单程序”指的是针对12864液晶显示器(LCD)设计的一个具有菜单功能的程序。12864LCD通常是指具有128列和64行像素的LCD模块,常用于单片机项目,特别是51系列单片机,因为它们提供了一个可视...
《公输》是《墨子》一书中的经典篇章...以上是《公输》练习题中涉及的主要知识点,涵盖了古汉语的基础知识和对《墨子》一书的理解。通过这些练习,学生可以更好地掌握古汉语的语法、词汇和文化背景,提高阅读理解能力。