一.背景
抽象工厂意味着生产出来的产品是不确定的,抽象工厂模式起源于以前对不同操作系统的图形化解决方案。
二.抽象工厂模式的定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类
三.抽象工厂模式的使用场景(还是没看懂)
例子:Android,ios,Window,Phone下都有短信软件,拨号软件,两者都属于Software软件的范畴,但是他们所在的操作系统的平台不一样,即便是同一家公司出品的软件,其代码的实现逻辑也是不同的,这时候就可以考虑使用抽象工厂方法模式来生产Android,ios,Window Phone下的短信软件和拨号软件
四.抽象工厂模式简单实现
Q3,Q5,Q7,可能轮胎发动机不一样,所以不可能是一条生长线出来的
抽象轮胎
public interface ITire { /** * 轮胎 */ void tire(); public class NormalTire implements ITire { @Override public void tire() { System.out.println("普通轮胎"); } } public class SUVTire implements ITire { @Override public void tire() { System.out.println("越野轮胎"); } } }
抽象引擎
public interface IEngine { /** * 轮胎 */ void engine(); public class DomesticEngine implements IEngine { @Override public void engine() { System.out.println("国产发动机"); } } public class ImportEngine implements IEngine { @Override public void engine() { System.out.println("进口发动机"); } } }
抽象刹车
public interface IBrake { /** * 轮胎 */ void brake(); public class NormalBrake implements IBrake { @Override public void brake() { System.out.println("普通刹车"); } } public class SeniorBrake implements IBrake { @Override public void brake() { System.out.println("只能刹车"); } } }
抽象工厂
public abstract class CarFactory { /** * 生产轮胎 * * @return 轮胎 */ public abstract ITire createTire(); /** * 生产发动机 * * @return 发动机 */ public abstract IEngine createEngine(); /** * 生产制动系统 * * @return 制动系统 */ public abstract IBrake createBrake(); }
生产Q3的工厂
public class Q3Factory extends CarFactory { @Override public ITire createTire() { return new NormalTire(); } @Override public IEngine createEngine() { return new DomesticEngine(); } @Override public IBrake createBrake() { return new NormalBrake(); } }
生产Q7的工厂
public class Q7Factory extends CarFactory { @Override public ITire createTire() { return new SUVTire(); } @Override public IEngine createEngine() { return new ImportEngine(); } @Override public IBrake createBrake() { return new SeniorBrake(); } }
生产Q5的工厂
public class Client { public static void main(String[] args) { //构造一个生产Q3的工厂 CarFactory factoryQ3 = new Q3Factory(); factoryQ3.createTire().tire(); factoryQ3.createEngine().engine(); factoryQ3.createBrake().brake(); System.out.println("-----------------------------------"); //构造一个生产Q5的工厂 CarFactory factoryQ5 = new Q5Factory(); factoryQ5.createTire().tire(); factoryQ5.createEngine().engine(); factoryQ5.createBrake().brake(); }
缺点:
上面只是模拟了Q3和Q7的工厂,如果此时我们需要增加Q5的工厂呢?对应的轮胎,制动系统和发动机类又要增加,这里就可以看出抽象工厂方法模式的一个弊端,就是类的陡增,如果工厂类过多,势必导致类文件非常多,因此在实际开发过程一定要权衡慎用
总结:
抽象工厂方法模式的优点:
一个显著的优点是分离接口与实现,客户端只是面向产品的接口编程而已,使切换产品类时更加灵活,容易
抽象工厂方法模式的缺点:
(1).类文件的爆炸性增加
(2)是不太容易扩展新的产品类,因为每当我们增加一个产品类就需要修改抽象工厂,那么所有的具体工厂类均会被修改