简单工厂类 Factory { 创建英雄的静态方法 IHero CreateHero(string heroName) { switch (heroName) { : return new DH(); : return new WD(); : return new KOG(); : return new POM(); default: return null; } } }
然后外部调用的时候通过简单工厂方法创建各个英雄的实例。
IHero dh = Factory.CreateHero(); dh.ShowSkills(); IHero wd = Factory.CreateHero(); wd.ShowSkills(); IHero kog = Factory.CreateHero(); kog.ShowSkills(); IHero pom = Factory.CreateHero(); pom.ShowSkills();
初识简单工厂模式的时候,最大的疑问就是,这个简单工厂类,无非就是把原来在外部调用时创建具体英雄类实例的代码挪了过去,在简单工厂类里面还是一样需要通过new指定具体的类来进行接口的实例化啊,而且还白白多了一个简单工厂类,意义何在?
其实简单工厂类最大的意义还是起到接口隔离的作用,看到隔离这个词,就肯定有隔离的双方(封装体),我们多增加一个简单工厂类,表面上看是多了一个类,并没有减少任何代码,也没有对代码进行大的更改,只是一个英雄实例化代码的位置移动,简单工厂模式的精髓恰恰就是这个具体类实例化代码位置的移动,我们知道,使用接口的目的就是不让外部调用知道封装体内部的实现,在使用简单工厂类之前,我们创建英雄实例的代码很明显的是位于外部调用部分的,这样其实就是没有隔离,由于简单工厂类位于封装体内部的,工厂类是可以知道具体的实现细节的。使用简单工厂类后,相当于这个封装提对外只公开了一个IHero接口及一个工厂类创建英雄的方法给外部调用,这样隔离就很明确了,只是一段代码位置的移动,从设计上来讲,已经发生了本质的变化。
3 简单工厂的几点建议简单工厂类中创建实例的方法,应为静态方法。
实例创建应尽量通过配置文件及反射机制,动态创建,达到能根据某个值,自动判断并创建对应类的实例的目的,这样就可以将庞大的swith语句块消除,同时,实例化部分的修改,只需要修改配置文件即可。
一个简单工厂可以定义多个创建实例的静态方法,建议按照不同的功能模块,创建不同的工厂类。因为简单工厂类是一个模块封装提的一部分。
4 简单工厂模式的优点能够非常简单快捷的实现模块的组件化,组件通过对外公开接口,实现面向接口编程
实现了外部调用和具体实现的解耦,增强了系统的健壮性和易维护性。
源码下载