什么是抽象工厂模式
提供一个为创建一组相关或相互依赖对象的接口,且无须指定它们的具体类。
它属于创建型模式。在抽象工厂模式中,每个具体工厂都提供了多个用于创建多种不同类型具体对象的方法,这些不同类型的对象都存在一个共同的属性,构成一个族。
抽象工厂模式的应用场景
上篇文章《设计模式(八):工厂方法模式》说到工厂方法模式中只考虑某一类产品的生产,例如可乐工厂只生产可乐,橙汁工厂只生产橙汁。而实际过程中,一个工厂往往要生产多种类的产品,例如可乐和橙汁一起生产,方便售卖。原有的工厂方法模式不符合实际使用的要求,所以聪明的先辈们又想到了一种新的设计模式——抽象工厂模式。
使用抽象工厂模式一般要满足以下条件。
抽象工厂与工厂方法的区别
抽象工厂模式中的工厂保留了工厂方法模式的优秀属性,同时可以创建多种类的产品,而工厂方法模式的工厂只能创建一类产品。
抽象工厂模式的优点:
抽象工厂模式的缺点:
拓展同一族的产品困难,需要从抽象层到具体实现中修改代码,违背了开放封闭原则
抽象工厂模式的结构与实现
1、抽象工厂的结构
抽象工厂模式与工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品、具体产品。具体结构如下:
AbstractFactory 为抽象工厂,ProductA 和ProductB 是抽象产品。ConcreteFactoryA和ConcreteFactoryB为具体工厂,ConcreteProductA 和 ConcreteProductB 是具体产品。
2、抽象工厂的实现
我们在上次文章的基础上加以拓展,工厂除了要生产衣服外,还要生产裤子。根据上面我们的描述,这时就适合用抽象工厂模式来实现。我们设计 A 和 B 两个工厂,A 工厂生产短裤和T恤衫,B 工厂生产牛仔裤和 POLO衫。我们对代码作以下调整:
//衣服interface Clothes { void desc();}//T恤衫class TShirt implements Clothes { @Override public void desc() { System.out.println("I'm TShirt"); }}//Polo衫class PoloShirt implements Clothes { @Override public void desc() { System.out.println("I'm PoloShirt"); }}//裤子interface Trousers { void desc();}//短裤class Short implements Trousers { @Override public void desc() { System.out.println("I'm Short"); }}//牛仔裤class Jeans implements Trousers { @Override public void desc() { System.out.println("I'm Jeans"); }} interface IFactory { Clothes produceClothes(); Trousers produceTrousers();}
class AFactory implements IFactory { @Override public Clothes produceClothes() { Clothes clothes = new TShirt(); return clothes; }
@Override public Trousers produceTrousers() { Trousers trousers = new Short(); return trousers; }}
class BFactory implements IFactory { @Override public Clothes produceClothes() { Clothes clothes = new PoloShirt(); return clothes; }
@Override public Trousers produceTrousers() { Trousers trousers = new Jeans(); return trousers; }}