【23种设计模式】-抽象工厂模式

偏执的太偏执、 2023-07-16 03:55 127阅读 0赞

什么是抽象工厂模式?

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端

提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

举个例子,现在有两个品牌厂商,小米和华为,小米生产手机和路由器,华为也生产手机和路由器,但是小米生产的产品都是在小米的工厂生产的,华为的产品都是在华为的工厂生产的,但是这两个工厂要符合同一个工厂标准,也就是抽象工厂。另外两个厂商都生产手机,这个生产的手机要否和手机产品的标准,生产的路由器也要符合路由产品的标准。综上所述每个厂商都会生产不同的产品也就是产品簇。所以抽象工厂是针对整个产品簇的。

具体实现代码如下:

手机产品接口:

  1. package abf;
  2. /**
  3. * 手机产品接口
  4. */
  5. interface IPhoneProduct {
  6. void call(); //打电话功能
  7. void sendSMS(); //发短信功能
  8. void open();//开机功能
  9. void close();//关机功能
  10. }

小米手机产品类:

  1. package abf;
  2. /**
  3. * 小米手机产品
  4. */
  5. public class XiaoMiPhone implements IPhoneProduct {
  6. public void call() {
  7. System.out.println("小米手机 call");
  8. }
  9. public void sendSMS() {
  10. System.out.println("小米手机 sendSMS");
  11. }
  12. public void open() {
  13. System.out.println("小米手机 open");
  14. }
  15. public void close() {
  16. System.out.println("小米手机 close");
  17. }
  18. }

华为手机产品类:

  1. package abf;
  2. /**
  3. * 华为手机产品
  4. */
  5. public class HuaWeiPhone implements IPhoneProduct {
  6. public void call() {
  7. System.out.println("华为手机 call");
  8. }
  9. public void sendSMS() {
  10. System.out.println("华为手机 sendSMS");
  11. }
  12. public void open() {
  13. System.out.println("华为手机 open");
  14. }
  15. public void close() {
  16. System.out.println("华为手机 close");
  17. }
  18. }

路由器产品接口:

  1. package abf;
  2. /**
  3. * 路由产品接口
  4. */
  5. interface IRouterProduct {
  6. void open(); //开机功能
  7. void close(); //关机功能
  8. void wifi(); //wifi功能
  9. }

小米路由器产品类:

  1. package abf;
  2. /**
  3. *小米路由器产品
  4. */
  5. public class XiaoMiRouter implements IRouterProduct {
  6. public void open() {
  7. System.out.println("小米路由器 open");
  8. }
  9. public void close() {
  10. System.out.println("小米路由器 close");
  11. }
  12. public void wifi() {
  13. System.out.println("小米路由器 wifi");
  14. }
  15. }

华为路由器产品接口:

  1. package abf;
  2. /**
  3. * 华为路由器产品
  4. */
  5. public class HuaWeiRouter implements IRouterProduct {
  6. public void open() {
  7. System.out.println("华为路由器 open");
  8. }
  9. public void close() {
  10. System.out.println("华为路由器 close");
  11. }
  12. public void wifi() {
  13. System.out.println("华为路由器 wifi");
  14. }
  15. }

抽象工厂

  1. package abf;
  2. /**
  3. * 抽象工厂
  4. */
  5. public interface AbstractFactory {
  6. //生产手机
  7. IPhoneProduct iphoneProduct();
  8. //生产路由器
  9. IRouterProduct irouterProduct();
  10. }

小米工厂:

  1. package abf;
  2. /**
  3. * 生产小米产品的工厂
  4. */
  5. public class XiaoMiFactory implements AbstractFactory {
  6. public IPhoneProduct iphoneProduct() {
  7. return new XiaoMiPhone();
  8. }
  9. public IRouterProduct irouterProduct() {
  10. return new XiaoMiRouter();
  11. }
  12. }

华为工厂:

  1. package abf;
  2. /**
  3. * 生产华为产品的工厂
  4. */
  5. public class HuaWeiFactory implements AbstractFactory{
  6. public IPhoneProduct iphoneProduct() {
  7. return new HuaWeiPhone();
  8. }
  9. public IRouterProduct irouterProduct() {
  10. return new HuaWeiRouter();
  11. }
  12. }

创建产品的测试类:

  1. package abf;
  2. public class Consumer {
  3. public static void main(String[] args) {
  4. //创建小米工厂
  5. XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
  6. //小米工厂生产手机
  7. IPhoneProduct iPhoneProduct = xiaoMiFactory.iphoneProduct();
  8. iPhoneProduct.call();
  9. iPhoneProduct.sendSMS();
  10. //小米工厂生产路由器
  11. IRouterProduct iRouterProduct = xiaoMiFactory.irouterProduct();
  12. iRouterProduct.open();
  13. iRouterProduct.wifi();
  14. iRouterProduct.close();
  15. //创建华为工厂
  16. HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
  17. //华为工厂生产手机
  18. IPhoneProduct iPhoneProduct1 = huaWeiFactory.iphoneProduct();
  19. iPhoneProduct1.sendSMS();
  20. iPhoneProduct1.call();
  21. //华为工厂生产路由器
  22. IRouterProduct iRouterProduct1 = huaWeiFactory.irouterProduct();
  23. iRouterProduct1.open();
  24. iRouterProduct1.wifi();
  25. iRouterProduct1.close();
  26. }
  27. }

输出结果如下:

  1. 小米手机 call
  2. 小米手机 sendSMS
  3. 小米路由器 open
  4. 小米路由器 wifi
  5. 小米路由器 close
  6. 华为手机 sendSMS
  7. 华为手机 call
  8. 华为路由器 open
  9. 华为路由器 wifi
  10. 华为路由器 close

总结:

什么场景下使用抽象工厂?

当一系列的相关对象(产品簇)稳定的情况下可以使用抽象工厂,如果抽象工厂对象频繁发生变化时则不适用,比如上面的例子我需要增加笔记本电脑的生产,那么抽象工厂、具体实现的工厂都要发生变化,这就违反了设计模式的开闭原则,这样是不推荐的。

发表评论

表情:
评论列表 (有 0 条评论,127人围观)

还没有评论,来说两句吧...

相关阅读