1. 原理图
简单看一下原理图,ProductFactory用于制造工厂,比如可以制造小米品牌的产品工厂和华为品牌的产品工厂,各种产品再由对应的产品工厂去制造
应用的场景:
比如下图这种情况,在同一产品族中有多个产品等级(不同产品等级对应不同的产品),小米中既有小米杯子又有小米手机,华为中既有华为的杯子又有华为的手机,这时就需要用到抽象工厂模式。
但是这种模式的局限也很明显:每当增加新的一个产品,需要在抽象工厂中修改代码,也需要在具体的实现工厂中修改代码,这样就违背了开闭原则。
那好处是啥?顾客能自由的选择喜欢的品牌,比如,我喜欢小米的品牌,那么我就可以用选择用小米旗下的所有产品。也就是说:它能保证客户端始终只使用同一个产品族中的对象。
2. 咱用代码实现来加深加深理解
我们为了代码简单,仅用小米工厂来举例子,下面是项目结构
具体的代码 ↓
//杯子产品的接口
public interface CupProduct {
//杯子喝水
void drink();
}
//手机产品的接口
public interface PhoneProduct {
//手机打电话
void call();
}
//我们的主要角色,抽象工厂
public interface ProductFactory {
//手机产品
PhoneProduct phone();
//杯子产品
CupProduct cup();
}
//小米工厂实现类
public class XiaoMiProductFactory implements ProductFactory {
@Override
public PhoneProduct phone() {
return new XiaoMiPhone();
}
@Override
public CupProduct cup() {
return new XiaoMiCup();
}
}
//小米手机实现类
public class XiaoMiPhone implements PhoneProduct {
@Override
public void call() {
System.out.println("用小米手机打电话");
}
}
//小米杯子实现类
public class XiaoMiCup implements CupProduct {
@Override
public void drink() {
System.out.println("用小米杯子喝水");
}
}
//最后是我们的客户测试类
public class Client {
public static void main(String[] args) {
//创建小米工厂
XiaoMiProductFactory xiaoMiProductFactory = new XiaoMiProductFactory();
//用小米工厂生产小米手机和杯子
PhoneProduct phone = xiaoMiProductFactory.phone();
phone.call();
CupProduct cup = xiaoMiProductFactory.cup();
cup.drink();
}
}
输出结果:
到这里我们的抽象工厂就讲解完了,最重要的还是要理解思想,可以回到文章开头,把抽象工厂模式再理解理解