在前面中,介绍过工厂方法模式,那么抽象工厂和工厂方法模式有哪些不一样呢?抽象工厂又可以解决什么样的问题呢?她在实际应用中又是如何发挥她的作用呢?今天这篇博文小编来主要简单的介绍一下抽象工厂模式,希望对有需要的小伙伴有帮助,不足之处,还请小伙伴多多指教。首先,我们来看一下什么是抽象工厂模式:
什么是抽象工厂?
抽象工厂模式是所有形态的工厂模式中最为抽象和最具其一般性的,抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。简单来说就是,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。以之前的demo为例,拷贝Apple、Banana、Fruit,并且修改Apple和Banana的代码部分,如下所示,首先修改Apple的代码部分:
public abstract class Apple implements Fruit { /** * 采集 */ public abstract void get(); }
Banana的代码部分,如下所示:
public abstract class Banana implements Fruit { /** * 采集 */ public abstract void get(); }
新建类NorthApple并继承Apple,编写代码如下所示:
public class NorthApple extends Apple { @Override public void get() { System.out.println("采集北方苹果"); } }
同样新建南方苹果类SouthApple,继承Apple类,并编写相关的代码部分,如下所示:
public class SouthApple extends Apple { @Override public void get() { System.out.println("采集南方苹果"); } }
同样新建NorthBanana和SouthBanana,代码类似NorthApple和SouthBanana,小编在这里就不一一进行介绍了,接着新建类FruitFactory,编写相关的代码部分,如下所示:
public interface FruitFactory { //实例化Apple public Fruit getApple(); //实例化Banana public Fruit getBanana(); }
新建类NorthFruitFactory,编写相关代码部分,如下所示:
public class NorthFruitFactory implements FruitFactory { @Override public Fruit getApple() { return new NorthApple(); } @Override public Fruit getBanana() { return new NorthBanana(); } }
同样的需要新建SouthFruitFactory,代码部分和NorthFruitFactory类似,不在赘述,新建类,MainClass,编写相关代码如下所示:
public class MainClass { public static void main(String[] args){ FruitFactory ff = new NorthFruitFactory(); Fruit apple = ff.getApple(); apple.get(); Fruit banana = ff.getBanana(); banana.get(); FruitFactory ff2 = new SouthFruitFactory(); Fruit apple2 = ff2.getApple(); apple2.get(); Fruit banana2 = ff2.getBanana(); banana2.get(); } }
接着,我们来运行一下,效果如下所示:
添加类WenshiApple类,并继承Apple类,编写代码如下所示:
public class WenshiApple extends Apple { @Override public void get() { System.out.println("采集温室苹果"); } }
同样的编写WenshiBanana,并继承Banana,编写相关代码和上述类似。
接着创建WenshiFruitFactory并实现FruitFactory,编写相关代码部分,如下所示:
public class WenshiFruitFactory implements FruitFactory { @Override public Fruit getApple() { return new WenshiApple(); } @Override public Fruit getBanana() { return new WenshiBanana(); } }
编写MainClass里面的代码部分,如下所示:
public class MainClass { public static void main(String[] args){ FruitFactory ff = new NorthFruitFactory(); Fruit apple = ff.getApple(); apple.get(); Fruit banana = ff.getBanana(); banana.get(); FruitFactory ff2 = new SouthFruitFactory(); Fruit apple2 = ff2.getApple(); apple2.get(); Fruit banana2 = ff2.getBanana(); banana2.get(); FruitFactory ff3 = new WenshiFruitFactory(); Fruit apple3 = ff3.getApple(); apple3.get(); Fruit banana3 = ff3.getBanana(); banana3.get(); } }
我们来看一下运行效果,如下所示:
模式中包含的角色及其职责
抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂(Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
抽象(Product)角色
抽象模式所创建的所有对象的父类,她负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
抽象模式所创建的具体实例对象
小编寄语:该博文,小编主要介绍了抽象工厂,结合之前学习过的模式,我们发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。