一、理解
(这一部分主要参考http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html)
在不同的操作系统下,Button和Text的实现是不一样的,如果我们按照这种继承方式去实现一个操作系统的某个具体功能(如一个文本编辑器),当我们切换操作系统时,那么Button和Text的实现都要改变,修改起来很复杂,很容易出现Windows下的Button是Unix下实现的。
我们可以按照Windows和Unix进行分类,可以得到:
当我们选择Unix系统时,那么它下面的所有的组件都是Unix下的实现,这样当我们改变操作系统时,只需要改变的是操作系统的类型,其他的都不用改变。
Windows和Unix就可以看成两个工厂,生产一系列该系统对应的组件。
UnixFactory返回的是UnixButton对象(其他类推),那我们只要在客户端中实例化UnixFactory,调用其中的创建组件的方法。当我们现在需要创建WindowsButton,那么只要将该工厂改为WindowsFactory即可,其他代码不变(因为这里面的UnixFatory和WindowsFactory都是实现AbstractFactory接口,实现了接口中的方法,根据java的向上转型很容易得出上述结论)
二、优点
客户端不需要具体的实现,只要根据接口编程(只要知道此时我需要创建Unix下的Button,我只要去调用UnixFactory这个工厂即可,让它创建Button,当我需要创建Windows下的Button,只要把工厂改变即可)
三、缺点
如果此时操作系统多个组件叫下拉列表List,那么我们在Unix和Windows下都需要编写List的实现,即抽象工厂需要修改,然后底下所有的具体工厂都要修改
网友评论