【Java面试高频-设计模式】-Java工厂模式什么?简单工厂?工厂方式模式?抽象工厂模式?
发布日期:2021-06-29 15:36:48 浏览次数:2 分类:技术文章

本文共 4116 字,大约阅读时间需要 13 分钟。

工厂模式(抽象类)

工厂模式更多的场景是在电商领域的应用是非常广泛的了。

工厂模式主要分为三种:

  • 简单工厂模式;
  • 工厂方法模式;
  • 抽象工程模式;

1 简单工厂模式

简单工厂就是把实例化的操作单独放到一个类中,这个类就成为了简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RI7yPeB5-1620870253918)(imgs\120.png)]

比如工厂是鼠标工厂,专业生产鼠标,给参数0,生产戴尔鼠标;给参数1,生产惠普鼠标。

商品类

abstract class Product{
public String name; public Product(String name) {
this.name = name; } }class Product1 extends Product{
public Product1(String name) {
super(name); } }class Product2 extends Product{
public Product2(String name) {
super(name); // TODO Auto-generated constructor stub } }

简单工厂类

// 简单工厂public class SimpleFactory {
public static void main(String[] args) {
int type = 1; Product product = null; if(type==1) {
product = new Product1("product1"); }else if(type==2) {
product = new Product1("product2"); } // 输出 System.out.println(product.name); }}

静态工厂的例子来创建的对象:

  • 简单工厂类里面包含的:
    • 商品的类型有哪些?
    • 创建商品的方法有哪些?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qeaxRZ1z-1620870253927)(imgs\121.png)]

这里的简单工厂就是可以根据类型不同来创建不同的商品,但是有一个问题?就是我每增加一种类型就是要修改createProduct方法中的if else方法。

反射来实现工厂模式

用一个hashMap来存储商品的类型,以及该商品的类别。

一个添加方法的方法,即往hashMap中存储类型以及product;

商品的创建过程更改为通过反射来创建了:即传入type之后,先通过hashMap来获取,之后类.newInstance创建好对象了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0KY5Kzd-1620870253929)(imgs\122.png)]

另外一种就是直接注册商品对象

hashMap中不存储类了,而是存储具体的实例化商品对象了。

2 工厂方法模式

工厂方法模式是对上述简单工厂模式中的静态工厂模式的一种改进,工厂类被抽象话,需要具体特定化的逻辑代码转移到实现抽象方法的子类中,这样就不用再去修改工厂类了。(即不用再去if else修改了),这也是当前比较常用的一种方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJRJ7iYQ-1620870253935)(imgs\123.png)]

有一个鼠标工厂作为父类,有生产鼠标这个接口;

戴尔鼠标工厂,惠普鼠标工厂继承工厂类,分别生产戴尔鼠标和惠普鼠标;

生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由具体的鼠标工厂创建。

商品类

abstract class Product{
public String name; public Product(String name) {
this.name = name; } }class Product1 extends Product{
public Product1(String name) {
super(name); } }class Product2 extends Product{
public Product2(String name) {
super(name); // TODO Auto-generated constructor stub } }

工厂方法类

// 抽象工厂abstract class Factory{
// 抽象方法生成商品 abstract public Product factoryMethod();}// 具体工厂类一个工厂生产一个商品class FactoryProduct1 extends Factory{
@Override public Product factoryMethod() {
return new Product1("product1"); }}class FactoryProduct2 extends Factory{
@Override public Product factoryMethod() {
// TODO Auto-generated method stub return new Product2("product2"); } }

3 抽象工厂模式

工厂方法类中只有一个抽象方法,要想实现多种不同的类对象,只能去创建不同的具体工厂方法的子类来实列化,而抽象工厂 则是让一个工厂负责创建多个不同类型的对象

通过例子来通俗易懂的理解:

抽象工厂模式就是不仅生产鼠标,同时生产键盘。

PC厂商是个父类,有生产鼠标、生产键盘两个接口;

戴尔工厂,惠普工厂继承父类工厂,可以分别生产戴尔鼠标+戴尔键盘和惠普鼠标+惠普键盘。

商品类:

//商品类abstract class Product{
private String name; public Product(String name) {
this.name = name; }}// 抽象的鼠标类abstract class Mouse extends Product{
public Mouse(String name) {
super(name); } }// 抽象的键盘类abstract class KeyBoard extends Product{
public KeyBoard(String name) {
super(name); } }// 具体的戴尔鼠标class DMouse extends Mouse{
public DMouse(String name) {
super(name); }}// 具体的惠普鼠标class HMouse extends Mouse{
public HMouse(String name) {
super(name); } }// 具体的戴尔键盘class DKeyBoard extends KeyBoard{
public DKeyBoard(String name) {
super(name); }}// 具体的惠普键盘class HKeyBoard extends KeyBoard{
public HKeyBoard(String name) {
super(name); }}

工厂类:

// 工厂抽象abstract class Factory{
// 生产产品1 public abstract Product createMouseProduct(); // 生产产品2 public abstract Product createKeyBoardProduct();}// 戴尔工厂class DellFactory extends Factory{
@Override public Product createMouseProduct() {
return new DMouse("dell mouse"); } @Override public Product createKeyBoardProduct() {
return new DKeyBoard("dell keyboard"); } }// 惠普工厂class HFactory extends Factory{
@Override public Product createMouseProduct() {
return new HMouse("hp mouse"); } @Override public Product createKeyBoardProduct() {
return new HKeyBoard("hp keyboard"); } }

4 工厂方法模式与抽象工厂模式的区别是什么?

工厂方法模式:

  • 一个抽象产品类,可以派生出多个具体产品类;
  • 一个抽象工厂类,可以派生出多个具体工厂类;
  • 每个具体工厂类只能创建一个具体产品类的实例;

抽象工厂模式:

  • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;
  • 一个抽象工厂类,可以派生出多个具体工厂类;
  • 每个具体工厂类可以创建多个具体产品类的实例;

区别:

  • 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个;
  • 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

例子:

  • 简单工厂模式:
    • 一个抽象的产品类;
      • 一个具体的惠普鼠标类;
      • 一个具体的戴尔鼠标类;
    • 一个具体的工厂类:在此处根据类型通过if-else来选择创建哪一个产品;
  • 工厂方法模式:
    • 一个抽象的产品类;
      • 一个具体的惠普鼠标类;
      • 一个具体的戴尔鼠标类;
    • 一个抽象的工厂类
      • 一个具体的生产惠普鼠标的工厂类;
      • 一个具体的生产戴尔鼠标的工厂类;
  • 抽象工厂模式:
    • 一个抽象的产品类;
      • 一个抽象的鼠标产品类;
        • 一个具体的戴尔鼠标类;
        • 一个具体的惠普鼠标类;
      • 一个抽象的键盘产品类;
        • 一个具体的戴尔鼠标类;
        • 一个具体的惠普鼠标类;
    • 一个抽象的工厂类;
      • 一个具体的戴尔工厂类;
      • 一个具体的惠普工厂类;

转载地址:https://codingchaozhang.blog.csdn.net/article/details/116737623 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Java面试高频-设计模式】- Java责任链模式
下一篇:【Java面试高频-设计模式】- java中观察者模式和发布订阅者模式的最大区别是什么呢?

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月09日 06时03分56秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Arm宣布推出Cortex-M55核心和Ethos-U55 microNPU,瞄准低功耗Edge AI 2019-04-29
开源项目|RT-Thread 软件包应用作品:小闹钟 2019-04-29
在 RT-Thread Studio 上使用 RT-Thread Nano 2019-04-29
开源项目|软件包应用作品:通用物联网系统平台 2019-04-29
【经验分享】RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据) 2019-04-29
单片机里面的CPU使用率是什么鬼? 2019-04-29
推荐一个优质Linux技术公众号-作者都是一线Linux代码贡献者们哦 2019-04-29
RT-Thread 编程风格指南 2019-04-29
95后高校电子教师,软硬兼修有趣有料! 2019-04-29
使用 STM32 通用 Bootloader ,让 OTA 更加 Easy 2019-04-29
Cache 的基本概念与工作原理 2019-04-29
装机量超亿台 RISC-V +IoT OS!中科蓝讯与RT-Thread战略合作,共推自主物联网生态发展 2019-04-29
Android程序员必备!面试一路绿灯Offer拿到手软,Android面试题及解析 2019-04-29
Android程序员的春天!12个View绘制流程高频面试题,分享PDF高清版 2019-04-29
深入交流安卓!新鲜出炉的Android面试真题集锦我给你们整理出来了!Android面试题及解析 2019-04-29
深入浅出Android开发!你会的还只有初级工程师的技术吗?一线互联网公司面经总结 2019-04-29
深度剖析原理!超全Android中高级面试复习大纲,含BATJM大厂 2019-04-29
温故而知新!Android开发者该学习哪些东西提高竞争力?成功入职阿里 2019-04-29
火爆知乎的Android面试题-Android-App的设计架构经验谈,大厂内部资料 2019-04-29
看完直接怼产品经理!Android多进程从头讲到尾,跳槽薪资翻倍 2019-04-29