抽象工厂,一看这个字面意思,还有抽象的工厂?就是看不见的工厂吗?
我是不明白为什么要叫这个模式为“抽象工厂”,按照我的理解,这个抽象工厂模式,最应该叫做:多产品工厂模式,或者叫系列产品工厂模式,或者叫超级工厂方法模式(因为他是工厂方法的延伸)。总之叫他抽象工厂,是有点不准确的,不能做到望文知意。
如果大家没有学过工厂方法,建议先学工厂方法。学会工厂方法,这个抽象工厂就非常非常简单了。
百度百科上对于抽象工厂模式的定义拿出来:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下, 创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。 因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例, 而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。 工厂类负责创建抽象产品的具体子类的实例。
大家心里肯定在骂娘了,这到底怎么理解啊?我是不是天生智商不足,根本看不懂百度百科说的啥?放心,我用最简单的方式给大家演示一下何为抽象工厂!
首先想象一个应用场景:我开了一家生产电脑配件公司,专门生产鼠标和键盘,另外一个人看我生意好了,也来模仿我也开一家类似的公司,也生产鼠标和键盘,而且价格比我的还低,质量比我的还好。
这个时候,就是抽象工厂发挥作用的时候了!!
使用步骤:1、定义具体的产品(数个)和他的父类。2、定义具体的工厂(数个)和他的父类,3、调用
//第一步,定义产品的父类和具体的产品 abstract class Keyboard{ public abstract void printfName();//只有一个方法,打印自己的名字 } abstract class Mouse{ public abstract void printfName();//只有一个方法,打印自己的名字 } class MyKeyboard extends Keyboard{ public void printfName() {//打印自己的名字 System.out.println("我是一个键盘,是我自己的公司生产的!!"); } } class MyMouse extends Mouse{ public void printfName() {//打印自己的名字 System.out.println("我是一个鼠标,是我自己的公司生产的!!"); } }
第二步,定义工厂父类和子类 abstract class Factory{ //定义父类 public abstract Keyboard createKeyboard(); //生产键盘 public abstract Mouse createMouse(); //生产鼠标 } class MyFactory extends Factory{ //定义我的工厂 public Keyboard createKeyboard() { return new MyKeyboard(); } public Mouse createMouse() { return new MyMouse(); } }
3、调用 Factory f=new MyFactory(); f.createKeyboard().printfName(); f.createMouse().printfName(); 结果: 我是一个键盘,是我自己的公司生产的!! 我是一个鼠标,是我自己的公司生产的!!
到这个时候,大家还没看到这个抽象工厂到底有什么牛的,还不如不用呢,对吧?但是,如果有一个公司叫做IBM,他发现做电脑还挺赚钱的,结果他也来抢老子的生意,那代码怎么写呢?请看:
class IbmMouse extends Mouse{ public void printfName() { System.out.println("我是一个鼠标,来自IBM"); } } class IbmKeyBoard extends Keyboard{ public void printfName() { System.out.println("我是一个键盘,也来自IBM"); } } class IbmFactory extends Factory{ public Keyboard createKeyboard() { return new IbmKeyBoard(); } public Mouse createMouse() { return new IbmMouse(); } }
这时候,我们的客户端只要稍微改一下,就可以了把所有的产品都换成ibm公司的了!
public static void main(String[] args) { Factory f=new IbmFactory(); f.createKeyboard().printfName(); f.createMouse().printfName(); } 结果: 我是一个键盘,也来自IBM 我是一个鼠标,来自IBM
看到没,我们把所有的产品一次性全部换成IBM公司的,只需要稍微修改了一下调用方法那里,其他都原封不动,对于系统来说,这是非常非常棒的,因为,你不需要修改原有的类和逻辑,并且轻而易举得将新的类加入到系统中,这对于程序的解耦是非常有帮助的。
这个就是抽象工厂的魅力!!他是工厂方法的一个扩展。他的名字应该叫超级工厂方法!!
如果你有更好的见解,欢迎留言!!