设计模式 抽象工厂
2011-04-17 14:13
204 查看
抽象工厂类似于工厂方法,只不过是创建多种产品,比如显卡分为三星的,华硕的,东芝的。而声卡也分为三星的,华硕的,东芝的,那么我们可以创建一个抽象工厂,它的子类是三星工厂,华硕工厂,东芝工厂,每个工厂有两个方法,分为生产自己品牌的显卡和声卡。
在运行的时候,创建一个ConcreteFactory实例,那么具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应该使用不同的具体工厂。最大的好处在于可以方便的交换产品系列,在一个应用中只要初始化的时候出现一次,只要改变具体的工厂即可使用不同的产品配置,而且我们客户端完全看不到具体实现,拿到的产品都是抽象的,方便我们利用多态。只是还有缺憾:因为我们的ConcreteFactory不一定是全局单实例的,如果不是单实例的,那么程序中可能会有多次实例化工厂,进而拿到具体的产品,这样如果我们哪一天换掉了实现,那么肯定遍布程序的具体工厂都要改,这非常丑陋。
现在我们运用反射。将具体的工厂名字放在配置文件里。具体做法如下:
这个东东实际上是用简单工厂+抽象工厂。简单工厂主要用来动态生成一个子类,向外暴露一个基类,而抽象工厂用来构造来给简单工厂使用的抽象层次,简单工厂的if-else可以考虑用反射技术来去除。
工厂方法和抽象工厂基本是一样的。
这样我们去除了if-else,而且我们的程序,连具体的工厂也看不见了,完全基于抽象来编程
在运行的时候,创建一个ConcreteFactory实例,那么具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应该使用不同的具体工厂。最大的好处在于可以方便的交换产品系列,在一个应用中只要初始化的时候出现一次,只要改变具体的工厂即可使用不同的产品配置,而且我们客户端完全看不到具体实现,拿到的产品都是抽象的,方便我们利用多态。只是还有缺憾:因为我们的ConcreteFactory不一定是全局单实例的,如果不是单实例的,那么程序中可能会有多次实例化工厂,进而拿到具体的产品,这样如果我们哪一天换掉了实现,那么肯定遍布程序的具体工厂都要改,这非常丑陋。
现在我们运用反射。将具体的工厂名字放在配置文件里。具体做法如下:
public class FactoryGenerator { public OperationFactory generateFacotry() { //....读取factory的具体名字 //运用发射实例化这个concreteFactory //返回 } }
这个东东实际上是用简单工厂+抽象工厂。简单工厂主要用来动态生成一个子类,向外暴露一个基类,而抽象工厂用来构造来给简单工厂使用的抽象层次,简单工厂的if-else可以考虑用反射技术来去除。
工厂方法和抽象工厂基本是一样的。
这样我们去除了if-else,而且我们的程序,连具体的工厂也看不见了,完全基于抽象来编程
相关文章推荐
- 设计模式- 使用抽象工厂实现多数据库切换实现过程
- Java设计模式——工厂方法和抽象工厂方法
- 设计模式系列(二)-抽象工厂
- 设计模式 - 简单工厂、工厂方法、抽象工厂
- 设计模式--工厂模式(工厂方法、抽象工厂)
- JAVA设计模式二:--Abstract Factory(抽象工厂)
- 设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)
- 设计模式:对象创建(原型,单例,简单工厂,工厂方法,抽象工厂,生成器)
- 【设计模式】——抽象工厂Abstract Factory
- 工场设计模式和抽象工厂设计模式
- 浅谈C++设计模式之抽象工厂(Abstract Factory)
- 系统架构-设计模式(适配器、观察者、代理、抽象工厂等)及架构模式(C/S、B/S、分布式、SOA、SaaS)(干货)
- 【设计模式学习笔记三】【创建型模式】【抽象工厂(Abstract Factory)】
- 设计模式学习之抽象工厂(Abstract Factory,创建型模式)(3)
- 设计模式学习-抽象工厂(Abstract Factory)
- [设计模式] 简单工厂/工厂方法/抽象工厂
- SSH中用到的设计模式之三——工厂方法和抽象工厂
- python设计模式(2)-Abstract Factory(抽象工厂)
- 设计模式之抽象工厂方法模式
- C语言设计模式:工厂和抽象工厂