🚗抽象工厂模式
定义
抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
角色
抽象产品
具体产品
抽象工厂
具体工厂
模式类图
🍓举个栗子
小米工厂生产小米手机和小米电脑
Vivo工厂生产Vivo手机和Vivo电脑
我们先假设下我们用工厂方法模式写的话,类图是什么呢?
🎈🎈🎈🎈🎈🎈🎈
那我们用工厂方法又是什么样的类图呢?
🎈🎈🎈🎈🎈🎈🎈
🎈:我们可以很明显的看出这个类比上面工厂方法的类少,这个也算是一个优点了
代码
🥛先来回顾下问题:
小米工厂生产小米手机和小米电脑
Vivo工厂生产Vivo手机和Vivo电脑
【Tpis】: 可以着重看下类图
编写顺序
Mobile > MiMobile > VivoMobile
Computer > MiComputer > VivoComputer
Factory > MiFactory > VivoFactory
Mobile.java
public interface Mobile { //打电话 void call(); }
MiMobile.java
public class MiMobile implements Mobile { @Override public void call() { System.out.println("我的小米"); } }
VivoMobile.java
public class VivoMobile implements Mobile { @Override public void call() { System.out.println("我的vivo"); } }
Computer.java
public interface Computer { //工作 void work(); }
MiComputer.java
public class MiComputer implements Computer { @Override public void work() { System.out.println("小米电脑"); } }
VivoComputer.java
public class VivoComputer implements Computer { @Override public void work() { System.out.println("vivo电脑"); } }
Factory.java
public interface Factory { Mobile getMobile(); Computer getComputer(); }
MiFactory.java
public class MiFactory implements Factory { @Override public Mobile getMobile() { return new MiMobile(); } @Override public Computer getComputer() { return new MiComputer(); } }
VivoFactory.java
public class VivoFactory implements Factory { @Override public Mobile getMobile() { return new VivoMobile(); } @Override public Computer getComputer() { return new VivoComputer(); } }
Client.java
public class Client { private static void useProduct(Factory factory){ factory.getComputer().work(); factory.getMobile().call(); } public static void main(String[] args) { useProduct(new VivoFactory()); System.out.println("=============="); useProduct(new MiFactory()); } }
结果
🧡模式优点
仍然有简单工厂和工厂方法的优点
抽象工厂把工厂类的数量减少了,无论有多少个产品等级,工厂就一套
💢模式缺点
当产品等级发生变化时,都要引起所有以前工厂代码的修改,比如我们要添加个 生产相机 ,那么Factory
里面的代码就得改,那么所有的具体工厂都得改,违反了开闭原则
😋模式适用环境
当产品等级比较固定时,可以考虑用抽象工厂
若产品等级经常变化,则不建议使用抽象工厂