Aha!设计模式(7)-抽象工厂(6)

2019-04-13 13:53发布

实 现   下面是实现Abstract Factor模式的一些有用技术:
1) 将工厂作为单件 一个应用中一般每个产品系列只需一个ConcreteFactory的实例。因此工厂通常最好实现为一个Singleton(3.5)。
  只有一句话,但是并没有给出实现。为了说明这个问题,作者按照自己的理解,以前面提到的操作系统主题的例子为背景提供一个实现。   类图: 有关Singleton设计模式的内容会在后续文章中详细介绍,这里先大概提一下。   ThemeFactory中首先将构造函数和析构函数设成保护的,这样用户就没有办法直接构建和销毁工厂对象。用户构建和销毁对象可以使用另外提供的两个公开的静态方法:getInstance和deleteInstance。Sington模式就是通过这种方式保证同一时刻只有一个对象存在的。   生成产品的createWindow和createScrobar两个接口,大家应该已经很熟悉了。   头文件     具体实现   头文件的内容和类图中一致,我们直接进入实现的部分。   首先观察include语句部分,为了控制具象类的创建和销毁,抽象类的实现包含了3个具象类的头文件。一般来讲这种感觉不怎么好。这个问题可以解决,但是会比较繁琐。这里就不再深入讨论了。   接下来是两个静态变量:instance用来保存ThemeFactory唯一的具象类实例;system_theme用来保存系统的设定值。由于这是个演示程序,所以用这么一个变量来控制程序的运行。   getInstance代码稍长,但内容不复杂:如果已经存在的工厂对象就是我们想要的具象类,就直接返回它,否则就将它销毁。无论是原本就不存在具象工厂实例还是因为不符合要求而销毁了已经存在的实例,都需要根据要求创建新的实例并返回。     其余的代码就更加简单,这里不再说明。   利用者代码     首先请注意,这里只包含了抽象类的头文件。并且由于抽象类的头文件中也没有包含具象类的头文件,所以具象类对利用者完全不可见。当系统的主题发生变化时,自动实现了具象工厂类的切换。   执行结果     注意观察工厂的切换动作。   下载链接   代码 https://github.com/xueweiguo/OOThinking/tree/master/Aha!DesignPattern/SingletonFactory   类图 https://github.com/xueweiguo/OOThinking/blob/master/Aha!DesignPattern/AhaDesignPattern.EAP   注: 本文中蓝 {MOD}粗体文字都引自《设计模式》一书。                          觉得本文有帮助?请分享给更多人。 阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】