前面的工厂模式出现一个情况,工厂只能生产一种类别的产品(比如键盘)
如果工厂要既能生产鼠标,又能生产键盘呢?如果需要有多个工厂,都能生产鼠标和键盘呢?这就用到了我们的抽象工厂模式。
工厂方法模式和抽象工厂模式不好分清楚,它们的区别如下:
工厂方法模式:
一个抽象产品类,可以派生出多个具体类
一个抽象工厂类,可以派生出多个具体类
每个具体工厂类智能创建一个具体产品类的实例
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品
例子:
工厂是电脑工厂,能生产鼠标和键盘
工厂又分别为罗技工厂和微软工厂,两个工厂生产的鼠标和键盘是分别两个厂商的
代码:
package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 12:48 */ public interface PCFactory { Mouse getMouseInstance(); KeyBoard getKeyBoardInstance(); } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 12:49 */ public class LuoJiPCFactory implements PCFactory { @Override public Mouse getMouseInstance() { return new LuoJiMouse(); } @Override public KeyBoard getKeyBoardInstance() { return new LuoJiKeyBoard(); } } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 12:50 */ public class MicrosoftPCFactory implements PCFactory { @Override public Mouse getMouseInstance() { return new MicroSoftMouse(); } @Override public KeyBoard getKeyBoardInstance() { return new MicroSoftKeyBoard(); } } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 11:45 */ public abstract class Mouse { public abstract void click(); } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 12:43 */ public class LuoJiMouse extends Mouse{ @Override public void click() { System.out.println("罗技鼠标点击"); } } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 12:44 */ public class MicroSoftMouse extends Mouse { @Override public void click() { System.out.println("微软鼠标宏"); } } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 11:45 */ public abstract class KeyBoard { public abstract void press(); } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 12:40 */ public class LuoJiKeyBoard extends KeyBoard { @Override public void press() { System.out.println("罗技键盘触感"); } } package com.zhen.build_template.abstract_factory; /** * @author zhen * @Date 2019/5/28 12:41 */ public class MicroSoftKeyBoard extends KeyBoard { @Override public void press() { System.out.println("微软式触感"); } }