抽象工厂模式
要理解抽象工厂模式,就要理解什么叫产品族,什么叫产品族呢?举个例子!苹果公司所生成的手机电脑属于一个产品族,小米公司生产的手机和电脑就属于一个产品族,不过苹果手机和小米手机属于同级产品,苹果电脑和小米电脑属于同级产品。
这里我们的抽象商品要设计两个,一个抽象的手机,一个抽象的电脑,工厂要按产品族来设计,如苹果公司的工厂只生产苹果设备,小米公司工厂只生产小米设备。
抽象工厂角色如下:
- 抽象产品:描述具体产品的共同特征(特征就是属性或者行为),这里的抽象产品是手机
- 具体产品:实现抽象产品(例如苹果手机、华为手机等...)
- 抽象工厂: 提供创建(生产)设备的方法
- 具体工厂: 实现抽象工厂
抽象工厂模式要添加产品的话要修改原有代码,所以它不满足开闭原则。
抽象产品代码
/**
* 抽象产品手机
*/
public interface Phone {
// 手机开机功能
void start();
}
/**
* 抽象产品电脑
*/
public interface Computer {
// 电脑开机
void start();
}
具体产品代码
/**
* 具体产品苹果11
*/
public class Iphone11 implements Phone{
@Override
public void start() {
System.out.println("苹果11开机...");
}
}
/**
* 具体产品苹果电脑
*/
public class MacBookPro implements Computer{
@Override
public void start() {
System.out.println("苹果电脑开机...");
}
}
/**
* 具体产品小米11
*/
public class XiaoMi11 implements Phone{
@Override
public void start() {
System.out.println("小米11开机...");
}
}
/**
* 具体产品小米电脑
*/
public class MiBookPro implements Computer{
@Override
public void start() {
System.out.println("小米电脑开机...");
}
}
抽象工厂代码
/**
* 抽象工厂
*/
public interface FoxconnFactory {
// 创建电脑
Computer createComputer();
// 创建手机
Phone createPhone();
}
具体工厂代码
/**
* 具体工厂苹果工厂
*/
public class AppleFactory implements FoxconnFactory{
// 创建苹果电脑
@Override
public Computer createComputer() {
return new MiBookPro();
}
// 创建苹果手机
@Override
public Phone createPhone() {
return new Iphone11();
}
}
/**
* 具体工厂小米工厂
*/
public class XiaoMiFactory implements FoxconnFactory{
// 创建小米电脑
@Override
public Computer createComputer() {
return new MiBookPro();
}
// 创建小米手机
@Override
public Phone createPhone() {
return new XiaoMi11();
}
}
测试代码
public class Test {
public static void main(String[] args) {
// 创建小米工厂对象
FoxconnFactory factory = new XiaoMiFactory();
// 创建小米电脑对象
Computer computer = factory.createComputer();
// 创建小米手机对象
Phone phone = factory.createPhone();
// 执行开机操作
computer.start();
phone.start();
}
}