前言
同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如手机厂即生产手机又生产电脑,抽象工厂模式将考虑同一产品族多等级产品的生产。(同一产品族可以形象理解为同一个品牌。)
定义
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
模式的角色和类图
角色
抽象工厂的角色如下:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
类图
具体代码如下:
/**
* @author hao
* 抽象产品
*/
public interface Phone {
void getName();
void call();
}
/**
* 具体产品1
*/
public class HuaweiPhone implements Phone {
@Override
public void getName() {
System.out.println("华为手机...");
}
@Override
public void call() {
System.out.println("华为手机打电话...");
}
}
/**
* 具体产品2
*/
public class XiaomiPhone implements Phone {
@Override
public void getName() {
System.out.println("小米手机...");
}
@Override
public void call() {
System.out.println("小米手机打电话...");
}
}
/**
* 抽象产品2
*/
public interface Computer {
void getName();
void playGame();
}
/**
* 具体产品2(1)
*/
public class HuaweiComputer implements Computer {
@Override
public void getName() {
System.out.println("华为电脑...");
}
@Override
public void playGame() {
System.out.println("华为电脑在玩游戏...");
}
}
/**
* 具体产品2(2)
*/
public class XiaomiComputer implements Computer {
@Override
public void getName() {
System.out.println("小米电脑...");
}
@Override
public void playGame() {
System.out.println("小米电脑在玩游戏...");
}
}
/**
* 抽象工厂
*/
public interface ElectricFactory {
Computer createCar();
Phone createPhone();
}
/**
* 具体工厂1
*/
public class HuaweiElectricFactory implements ElectricFactory {
@Override
public Computer createCar() {
return new HuaweiComputer();
}
@Override
public Phone createPhone() {
return new HuaweiPhone();
}
}
/**
* 具体工厂2
*/
public class XiaomiElectricFactory implements ElectricFactory {
@Override
public Computer createCar() {
return new XiaomiComputer();
}
@Override
public Phone createPhone() {
return new XiaomiPhone();
}
}
测试代码如下:
public class MainTest {
public static void main(String[] args){
ElectricFactory xiaomiF = new XiaomiElectricFactory();
Computer xiaomiFComputer = xiaomiF.createComputer();
Phone xiaomiPhone = xiaomiF.createPhone();
xiaomiFComputer.getName();
xiaomiFComputer.playGame();
xiaomiPhone.getName();
xiaomiPhone.call();
ElectricFactory huaweiF = new HuaweiElectricFactory();
Computer huaweiFCar = huaweiF.createComputer();
Phone huweiFPhone = huaweiF.createPhone();
huaweiFCar.getName();
huaweiFCar.playGame();
huweiFPhone.getName();
huweiFPhone.call();
}
}
结果:
小米电脑…
小米电脑在玩游戏…
小米手机…
小米手机打电话…
华为电脑…
华为电脑在玩游戏…
华为手机…
华为手机打电话…
优缺点分析
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。(优缺点来源于百度)