设计模式--创建型模式之抽象工厂模式

抽象工厂模式是工厂模式中最抽象的一个工厂模式,引入的产品组的概念,对它的定义就是将一组相关或相互依赖的对象提供接口,而不需要具体的对象,这个定义是很抽象的。

抽象工厂模式包括的角色:

    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();
	}
}

输出:


抽象工厂特点就是:每个工厂都只是生产自己特定的产品,不同工厂生产的产品实例是不关联的,这需要我们在客户端进行封装的时候就要做好。

缺点:添加一个具体工厂很简单,但是工厂想生产一种新的产品,会修改很多类。因为没加一个新产品,那么就要在抽象工厂里定义创建新产品对象的方法,而其他具体工厂又是实现该抽象工厂。

什么时候用抽象工厂模式呢?

产品多,关系复杂,产品可以抽象出来,那么就适合用抽象工厂模式

猜你喜欢

转载自blog.csdn.net/u010943801/article/details/79720073