国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php框架 > 框架设计 > 设计模式――工厂模式

设计模式――工厂模式

来源:程序员人生   发布时间:2015-03-13 08:14:02 阅读次数:3209次

场景设置

还记得前面讲到过的简单工厂模式吗?
在客户端(main中)的时候依然需要用到AnimalFactory.getAnimale(0) 来对动物种类进行选择,则当新增加动物种类的时候,不能不在原工厂类AnimalFactory 中进行代码的改动,这相当于在后台进行改
动。
现在我们要解决的就是去掉Factory中的switch语句和任何判断的逻辑,仅仅利用继承或多态在客户端实现对动物的选择。

首先定义动物的基本性质(吃,叫,跑,睡)。 interface Animal{ public void eat(); public void shout(); public void run(); public void sleep(); }

然后实现物种多样化

class Dog implements Animal{ @Override public void eat() { System.out.println("dog eat"); } @Override public void shout() { System.out.println("dog shout"); } @Override public void run() { System.out.println("dog run"); } @Override public void sleep() { System.out.println("dog sleep"); } } class Cat implements Animal{ @Override public void eat() { System.out.println("cat eat"); } @Override public void shout() { System.out.println("cat shout"); } @Override public void run() { System.out.println("cat run"); } @Override public void sleep() { System.out.println("cat sleep"); } }

至此,与简单工厂模式没有任何区分。重点以下:
将工厂虚拟化,使得具体的工厂生产具体的动物,而所有的具体工厂都应当具有抽象工厂的特性(属性或方法)。这个抽象的工厂以下:

interface Factory{ public Animal getAnimal(); }

对上述的动物,需要有对应的动物工厂:

class DogFactory implements Factory{ @Override public Animal getAnimal() { return new Dog(); } } class CatFactory implements Factory{ @Override public Animal getAnimal() { return new Cat(); } }

终究,客户端所要实现的东西即为:

public static void main(String[] args){ Factory dogFac = new DogFactory(); Animal dog = dogFac.getAnimal(); Factory catFac = new CatFactory(); Animal cat = catFac.getAnimal(); }

而不是简单工厂方法中的:

public static void main(String[] args){ List<Animale> zoo = new ArrayList<Animale>(); for(int i=0;i<4;i++) zoo.add(AnimalFactory.getAnimale(0)); for(int i=0;i<2;i++) zoo.add(AnimalFactory.getAnimale(1)); for(int i=0;i<4;i++) zoo.add(AnimalFactory.getAnimale(2)); for(int i=0;i<2;i++) zoo.add(AnimalFactory.getAnimale(3)); for(Animale animale:zoo){ //animale.... } }

这样做的好处是,充分体现了面向接口编程而不是面向实现编程。面向接口,相当于将具体的实现插入到了这个接口。即使实现的东西有问题(DogFactory or CatFactory),直接把它替换掉,或修改对应的实现类便可;如果需要增加新的物种(山羊,母鸡等等),只需要在Factory接口上插入GoatFactory或ChickenFactory便可。
其实依照这个思路,Animal 这个接口的实现也能够理解为在Animal的接口上插入各种具体的动物。

打个比方:就好比计算机的主板上本身有各种各样的插口,内存的、硬盘的、cpu的等等,这些都是接口;接口上插的是对应的实现,比如内存条,硬盘和不同规格的cpu。当这些实现坏了,就直接拔下来换个好的插上,就相当于上述例子中Factory接口上的DogFactory有问题,那末直接修改DogFactory便可,而不用动CatFactory,更不用动主板main方法。
试想如果计算机的主板上不是插口,而是直接焊接的各种原件,那末当任何1个坏掉以后,都需要对主板进行修理,那末这个损失将是巨大的。换言之,在简单工厂模式中,改动任何1个动物(增加、删除)都会使得Factory类进行修改同时,客户端main中的逻辑也可能需要修改。

综上所述,工厂模式的的确确很好的体现了面向接口编程的思想,也更好的利用多态,将类和类之间有效的解耦,是1款经典的设计模式。

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生