抽象工厂模式是工厂模式中最抽象的一个工厂模式,引入的产品组的概念,对它的定义就是将一组相关或相互依赖的对象提供接口,而不需要具体的对象,这个定义是很抽象的。
抽象工厂模式包括的角色:
1.抽象工厂类:声明一组用于创建一种产品的的方法
2.具体工厂类:继承了抽象工厂类,创建一组具体产品的对象
3.抽象产品类:所有产品对象的父类,负责描述所有产品实例共有的公共接口
4.具体产品类:抽象产品类的实现类 ,实现某个具体的产品对象
,我们来举个例子:以电脑为例子,电脑A配的是cpuA和显卡A,电脑B配的是cupB和显卡B。
可能这样讲还是有点模糊,看下面的代码实现后,再回来看应该就能明白了:
抽象产品类
public interface Computer {
public void work();
}
public abstract class Cpu implements Computer{
public abstract void work();
}
public abstract class DisplayCard implements Computer {
public abstract void work();
}
具体产品类
public class CpuA extends Cpu {
public void work() {
System.out.println("我是电脑A的cpuA");
}
}
public class DisplayCardA extends DisplayCard{
public void work() {
System.out.println("我是电脑A的显卡A");
}
}
public class CpuB extends Cpu {
public void work() {
System.out.println("我是电脑B的cpuB");
}
}
public class DisplayCardB extends DisplayCard {
public void work() {
System.out.println("我是电脑B的显卡B");
}
}
抽象工厂类
public interface ComputerFactory {
public Cpu getCpu();
public DisplayCard getDisplayCard();
}
具体工厂类
电脑A的具体工厂类
public class ComputerFactoryA implements ComputerFactory {
public Cpu getCpu() {
return new CpuA();
}
public DisplayCard getDisplayCard() {
return new DisplayCardA();
}
}
电脑B的具体工厂类
public class ComputerFactoryB implements ComputerFactory {
public Cpu getCpu() {
return new CpuB();
}
public DisplayCard getDisplayCard() {
return new DisplayCardB();
}
}
测试
public class FactoryTest {
public static void main(String[] args) {
ComputerFactory computerFactoryA = new ComputerFactoryA();
Cpu cpuA = computerFactoryA.getCpu();
DisplayCard displayCardA = computerFactoryA.getDisplayCard();
cpuA.work();
displayCardA.work();
System.out.println("===========================");
ComputerFactory computerFactoryB = new ComputerFactoryB();
Cpu cpuB = computerFactoryB.getCpu();
DisplayCard displayCardB = computerFactoryB.getDisplayCard();
cpuB.work();
displayCardB.work();
}
}
输出:
抽象工厂特点就是:每个工厂都只是生产自己特定的产品,不同工厂生产的产品实例是不关联的,这需要我们在客户端进行封装的时候就要做好。
缺点:添加一个具体工厂很简单,但是工厂想生产一种新的产品,会修改很多类。因为没加一个新产品,那么就要在抽象工厂里定义创建新产品对象的方法,而其他具体工厂又是实现该抽象工厂。
什么时候用抽象工厂模式呢?
产品多,关系复杂,产品可以抽象出来,那么就适合用抽象工厂模式