设计模式 抽象工厂

来源:互联网 发布:php exec bat 编辑:程序博客网 时间:2024/04/26 11:05

抽象工厂类似于工厂方法,只不过是创建多种产品,比如显卡分为三星的,华硕的,东芝的。而声卡也分为三星的,华硕的,东芝的,那么我们可以创建一个抽象工厂,它的子类是三星工厂,华硕工厂,东芝工厂,每个工厂有两个方法,分为生产自己品牌的显卡和声卡。

在运行的时候,创建一个ConcreteFactory实例,那么具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应该使用不同的具体工厂。最大的好处在于可以方便的交换产品系列,在一个应用中只要初始化的时候出现一次,只要改变具体的工厂即可使用不同的产品配置,而且我们客户端完全看不到具体实现,拿到的产品都是抽象的,方便我们利用多态。只是还有缺憾:因为我们的ConcreteFactory不一定是全局单实例的,如果不是单实例的,那么程序中可能会有多次实例化工厂,进而拿到具体的产品,这样如果我们哪一天换掉了实现,那么肯定遍布程序的具体工厂都要改,这非常丑陋。

现在我们运用反射。将具体的工厂名字放在配置文件里。具体做法如下:

这个东东实际上是用简单工厂+抽象工厂。简单工厂主要用来动态生成一个子类,向外暴露一个基类,而抽象工厂用来构造来给简单工厂使用的抽象层次,简单工厂的if-else可以考虑用反射技术来去除。

工厂方法和抽象工厂基本是一样的。

这样我们去除了if-else,而且我们的程序,连具体的工厂也看不见了,完全基于抽象来编程

原创粉丝点击