文章目录

  • 一、类型
  • 二、定义
  • 三、参与者
  • 四、类图
  • 五、示例
  • 六、适用情况
  • 参考文章

一、类型

创建型模式


二、定义

定义一个接口,用于创建一组相关或有依赖关系的对象,而且无需指定这些对象具体的类。


三、参与者

1、AbstractFactory:抽象工厂,用于声明创建抽象产品对象的方法
2、ConcreteFactoryAbstractFactory 抽象工厂的实现类,实现创建具体产品的方法
3、AbstractProduct:某一类产品的接口
4、ConcreteProductAbstractProduct 接口的实现类,定义具体的产品对象
5、Client:调用类,仅使用 AbstractFactoryAbstractProduct 声明的接口


四、类图

说明

  • ICatIDog 都是产品接口,而 WhiteCatBlack CatWhiteCatWhiteDog 是产品接口的具体实现类,是具体的产品。
  • IAnimalFactory 是抽象工厂接口,负责定义方法,这里定义了创建 ICatIDog 对象的方法; WhiteAnimalFactoryBlackAnimalFactory 是工厂接口的具体实现类,负责实现创建对象的方法。
  • WhiteAnimalFactory 负责创建白色动物对象,依赖 WhiteCatWhiteDog 类; BlackAnimalFactory 负责创建黑色动物对象,依赖 BlackCatBlackDog 类。
  • Client 负责调用工厂和产品接口,它不接触具体的产品对象。

五、示例

1、AbstractProduct:定义猫和狗这两种动物的产品接口,并定义方法 show()

public interface ICat {void show();
}
public interface IDog {void show();
}

2、ConcreteProduct:创建 ICatIDog 接口的实现类,每个接口分别有两个实现类,分别是 WhiteCatBlackCatWhiteDogBlackDog

public class WhiteCat implements ICat {@Overridepublic void show() {System.out.println("This cat is white");}
}
public class BlackCat implements ICat {@Overridepublic void show() {System.out.println("This cat is black");}
}
public class WhiteDog implements IDog {@Overridepublic void show() {System.out.println("This dog is white");}
}
public class BlackDog implements IDog {@Overridepublic void show() {System.out.println("This dog is black");}
}

3、AbstractFactory:定义一个 IAnimalFactory 抽象工厂接口,里面定义创建 ICatIDog 对象的方法

public interface IAnimalFactory {ICat createCat();IDog createDog();
}

4、ConcreteFactory:创建 IAnimalFactory 接口具体的实现类,分别是 WhiteAnimalFactoryBlackAnimalFactory ,它们分别用于创建白色和黑色的动物

public class WhiteAnimalFactory implements IAnimalFactory {@Overridepublic ICat createCat() {return new WhiteCat();}@Overridepublic IDog createDog() {return new WhiteDog();}
}
public class BlackAnimalFactory implements IAnimalFactory {@Overridepublic ICat createCat() {return new BlackCat();}@Overridepublic IDog createDog() {return new BlackDog();}
}

5、Client:定义一个客户端进行调用,注意我们在这里只和工厂接口和工厂实现类以及产品接口打交道,不和任何具体的产品实现类打交道

public class Client {public static void main(String[] args) {IAnimalFactory whiteFactory = new WhiteAnimalFactory();ICat whiteCat = whiteFactory.createCat();whiteCat.show();IDog whiteDog = whiteFactory.createDog();whiteDog.show();IAnimalFactory blackFactory = new BlackAnimalFactory();ICat blackCat = blackFactory.createCat();blackCat.show();IDog blackDog = blackFactory.createDog();blackDog.show();}
}

运行结果:


六、适用情况

  • 优点:很好的发挥了开闭原则、依赖倒置原则。
  • 缺点:有点繁重。替换具体的工厂时只需要修改一行代码,但如果要在抽象工厂接口中新增方法,就要修改所有具体的工厂类。
  • 综上,抽象工厂模式适用于增加具体产品这样的横向扩展需求,不适合新增方法这样的纵向扩展。

参考文章

  • https://blog.csdn.net/zhengzhb/article/details/7359385
  • https://blog.csdn.net/l1028386804/article/details/45440309
  • https://www.zhihu.com/question/308850392
  • http://www.atguigu.com/download_detail.shtml?v=202

JAVA设计模式之——抽象工厂模式相关推荐

  1. JAVA设计模式之抽象工厂模式

    本文继续介绍23种设计模式系列之抽象工厂模式. 前面已经介绍过简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例. 例子背景: 随着客户的要求越来越高,宝马车需 ...

  2. Java设计模式之 抽象工厂模式实验报告书

    目录 Java设计模式之 1 抽象工厂模式实验报告书 1 实验四:抽象工厂模式 2 一.实验目的 2 二.实验内容 2 三.实验步骤 2 3.1抽象工厂模式:电器工厂 2 3.2 car 6 3.3 ...

  3. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  4. Java设计模式:抽象工厂模式

    1. 定义 抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例. 抽象工厂模式与工厂 ...

  5. 最简单java设计模式:抽象工厂模式

    前言 在前一篇文章讲解了一下简单工厂模式和工厂方法模式,这篇文章再把抽象工厂模式讲解一下. 一.什么是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提 ...

  6. JAVA设计模式之抽象工厂模式和代理模式

    目录 一.抽象工厂模式 1.1.模式的定义与特点 1.2.模式的结构 二.代理模式 2.1代理模式的定义与特点 2.2代理模式的结构与实现 一.抽象工厂模式 1.1.模式的定义与特点 抽象工厂(Abs ...

  7. Java设计模式:抽象工厂模式--农场的季节生产对应水果举例

    /*** 农场的抽象.不同季节生产不同的蔬菜和水果.*/ public interface Farm {//不同季节,不同蔬菜和水果.int WINTER = 1; //冬季.int SUMMER = ...

  8. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  9. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

最新文章

  1. IO实现账号密码校验
  2. 去除ArcMap连接空间数据库中多余的属性表
  3. 微软 HoloLens 2 正式登场!让你看看什么叫真正的黑科技
  4. working space和working set关系
  5. Python爬虫中最重要、最常见、一定要熟练掌握的库
  6. 2048小游戏设计思路
  7. docker -v 文件夹下没有数据_微服务就是Dubbo?并没有那么简单!微服务架构+Docker+k8s了解下...
  8. 钉钉主要是用来打卡的,为什么打卡不能放在首页?
  9. 利用三轴加速度求解位移的算法——来自飞思卡尔方案
  10. MacBook安装rar解压工具
  11. 几款优秀的个人防火墙
  12. 虚拟化基本知识及virtio-net初探
  13. python中char是什么意思_MySQL中char和varchar的区别是什么
  14. 跟着我学习 AI丨语音识别:将语音转为数字信号
  15. error:type/value mismatch at ... ::iterator
  16. 维生素C片剂市场现状及未来发展趋势
  17. 代理ARP的作用和原理
  18. 一文读懂transformer(CV专享)
  19. YII2.0 接口开发步骤
  20. PDM系统的数据管理能力

热门文章

  1. OpenCV利用鼠标操作测量角度
  2. pytorch DDP加速之gradient accumulation设置
  3. 模电学习2. NPN型三极管电流电压计算实战
  4. Web前端面试指导(四十四):什么是响应式开发?
  5. 大学计算机基础毕业论文操作步骤,大学计算机基础教学论文论文
  6. 宽带用户易被攻击 七大注意避免损失(转)
  7. Android拍照相册裁剪封装
  8. mac lion 系统安装
  9. PAT10321032 挖掘机技术哪家强 (20 分)
  10. linux-pam 编译,PAM后门编译安装