抽象工厂模式(Abstract Factory Pattern)
定义
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
工厂方法和抽象工厂
- 工厂方法生产的对象为同一层级的,如苹果手机、三星手机和华为手机等
- 抽象工厂生产的对象为同一系列的,如苹果、三星和华为的手机、电脑和手环等
- 工厂方法一个工厂对应一个产品
- 抽象工厂一个工厂对应一个系列的产品
- 抽象工厂是工厂方法的扩展
优点
- 易于切换一系列产品
- 易于扩展新系列,符合开闭原则
缺点
- 扩展新产品时改动较大,如加个平板等
应用
- dao层,切换数据库,mysql、oracle、mongodb、redis的切换
- 框架整合,如切换持久层、数据源等
- 有多个系列,每个系列有多个产品的场景
代码演示
public class AbstractFactoryDemo {
public static void main(String[] args) {
// 苹果工厂 -- 1
Factory factory = new AppleFactory();
// 三星工厂 -- 2
// Factory factory = new SamsungFactory();
// 华为工厂 -- 3
// Factory factory = new HuaWeiFactory();
Phone phone = factory.createPhone();
phone.call();
Computer computer = factory.createComputer();
computer.code();
Bracelet bracelet = factory.createBracelet();
bracelet.record();
/*
1
用苹果手机打电话
用苹果电脑写代码
用苹果手环记录心跳
2
用三星手机打电话
用三星电脑写代码
用三星手环记录心跳
3
用华为手机打电话
用华为电脑写代码
用华为手环记录心跳
*/
}
}
// 第一种产品:手机
interface Phone {
void call();
}
// 苹果手机
class ApplePhone implements Phone {
@Override
public void call() {
System.out.println("用苹果手机打电话");
}
}
// 三星手机
class SamsungPhone implements Phone {
@Override
public void call() {
System.out.println("用三星手机打电话");
}
}
// 华为手机
class HuaWeiPhone implements Phone {
@Override
public void call() {
System.out.println("用华为手机打电话");
}
}
// 第二种产品:电脑
interface Computer {
void code();
}
// 苹果电脑
class AppleComputer implements Computer {
@Override
public void code() {
System.out.println("用苹果电脑写代码");
}
}
// 三星电脑
class SamsungComputer implements Computer {
@Override
public void code() {
System.out.println("用三星电脑写代码");
}
}
// 华为电脑
class HuaWeiComputer implements Computer {
@Override
public void code() {
System.out.println("用华为电脑写代码");
}
}
// 第三种产品:手环
interface Bracelet {
void record();
}
// 苹果手环
class AppleBracelet implements Bracelet {
@Override
public void record() {
System.out.println("用苹果手环记录心跳");
}
}
// 三星手环
class SamsungBracelet implements Bracelet {
@Override
public void record() {
System.out.println("用三星手环记录心跳");
}
}
// 华为手环
class HuaWeiBracelet implements Bracelet {
@Override
public void record() {
System.out.println("用华为手环记录心跳");
}
}
// 工厂
interface Factory {
Phone createPhone();
Computer createComputer();
Bracelet createBracelet();
}
// 苹果工厂
class AppleFactory implements Factory {
@Override
public Phone createPhone() {
return new ApplePhone();
}
@Override
public Computer createComputer() {
return new AppleComputer();
}
@Override
public Bracelet createBracelet() {
return new AppleBracelet();
}
}
// 三星工厂
class SamsungFactory implements Factory {
@Override
public Phone createPhone() {
return new SamsungPhone();
}
@Override
public Computer createComputer() {
return new SamsungComputer();
}
@Override
public Bracelet createBracelet() {
return new SamsungBracelet();
}
}
// 华为工厂
class HuaWeiFactory implements Factory {
@Override
public Phone createPhone() {
return new HuaWeiPhone();
}
@Override
public Computer createComputer() {
return new HuaWeiComputer();
}
@Override
public Bracelet createBracelet() {
return new HuaWeiBracelet();
}
}