iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java工厂模式的深入了解
  • 673
分享到

Java工厂模式的深入了解

2024-04-02 19:04:59 673人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、简单工厂模式二、工厂方法模式三、抽象工厂模式3.1、抽象工厂模式的定义3.2、  抽象工厂模式的结构3.3抽象工厂模式代码示例四、小结一、简单工厂模式 何为简单工厂

一、简单工厂模式

何为简单工厂模式?

首先先通过一个案例来理解

我有一个需求,要买车,买车有不同的型号,那么我们常见的做法就是我买车点有什么车我就买什么车,实例如下

定义一个车接口

 
public interface Car {
    void name();
}

定义一个实现类,例如宝马

public class Baoma implements Car {
 
    @Override
    public void name() {
        System.out.println("宝马");
    }
}

测试

public class Test {
    public static void main(String[] args) {
        
        Car car3 = new Baoma();
        car3.name();

 结果:宝马

很显然这并不符合我们工厂设计模式的思想,我们不应该让用户去new一个车出来,现实生活中也不可能自己去new一个车然后自己买,对不对,因此我们要设计一个简单的工厂来满足我们的需求,

简单工厂类

public class CarFactory {
    public static Car getCar(String car) {
        if(car.equals("宝马")) {
            return new Baoma();
        }else if(car.equals("奥迪")) {
            return new AoDI();
        }
        return null;
    }
}

测试

 Car car = CarFactory.getCar("宝马");
        car.name();
 
        Car car1 = CarFactory.getCar("奥迪");
        car1.name();

结果:宝马 奥迪

那么此时我们用户就不需要去关心我们的车是怎么来的,车该怎么造出来,造出来是什么车,我用户只管从工厂中去拿出我们需要的车即可,如果没有,再从工厂中去添加

         

该图是对简单工厂模式的一个辅助理解。     

总结一下,简单工厂模式: 用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)                  

二、工厂方法模式

那么在简单工厂类大家应该发现了一个问题,如果我们需要添加一辆新车,就需要进入工厂修改工厂的代码,如果我们修改了我们的代码,那么久违反了我们设计模式的开闭原则,不好,那么我们就来到了我们的工厂方法模式。

何为工厂方法模式,示例如下:

其中车类和车接口不变,我们改变一下车工厂

我们定义一个车接口,方法返回一辆车

public interface CarFactory {
    Car getCar();
}

那么我们可以想就是给每个车都配一个车工厂,那么添加的时候,只需要在新添加一个车工厂,去实现这个车工厂接口即可

奥迪工厂

public class AoDIFactory implements CarFactory{
 
    @Override
    public Car getCar() {
        return new AoDI();
    }
}

宝马工厂我就不演示了。

测试

        Car baoma = new BaoMaFactory().getCar();
        Car Aodi = new AoDIFactory().getCar();
 
        baoma.name();
        Aodi.name();

 

那么此时如果我们要添加新车,我们只需要去添加他的车以及他的工厂即可,用户则只需要去找对应的工厂

 

总结一下,

工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)

三、抽象工厂模式

前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。

同种类称为同等级,也就是说:工厂方法模式中只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。

这里需要先了解一个定义:

产品族:将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族

如图所示

3.1、抽象工厂模式的定义

是一种为访问类提供一个创建一组相关或相互依赖对象接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

使用抽象工厂模式一般要满足以下条件

可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组
抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。

当然使用抽象工厂模式也是有缺点的:        

当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

3.2、  抽象工厂模式的结构

1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。

2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。

3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。

4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

3.3抽象工厂模式代码示例

首先我们去定义抽象产品

比如

 * @Description 车接口
 */
public interface Car {
    void startCar();
    void stopCar();
    void washCar();
}
 * @Description 车载音响类
 */
public interface CarAudio {
    void startCarAudio();
    void stopCarAudio();
}

提供具体的产品

 * @Description 奥迪车
 */
public class AodiCar implements Car {
    @Override
    public void startCar() {
        System.out.println("启动奥迪车");
    }
 
    @Override
    public void stopCar() {
        System.out.println("关闭奥迪车");
    }
 
    @Override
    public void washCar() {
        System.out.println("洗奥迪车");
    }
}
 * @Description 奥迪车载音响
 */
public class AodiCarAudio implements CarAudio{
 
    @Override
    public void startCarAudio() {
        System.out.println("开启奥迪车载音响");
    }
 
    @Override
    public void stopCarAudio() {
        System.out.println("关闭奥迪车载音响");
    }
}
 * @Description 宝马车
 */
public class BaoMacar implements Car{
    @Override
    public void startCar() {
        System.out.println("开启宝马");
    }
 
    @Override
    public void stopCar() {
        System.out.println("停下宝马");
    }
 
    @Override
    public void washCar() {
        System.out.println("洗宝马");
    }
}
 * @Description 宝马车载音响
 */
public class BaomaCarAudio implements CarAudio{
    @Override
    public void startCarAudio() {
        System.out.println("打开宝马车载音响");
    }
 
    @Override
    public void stopCarAudio() {
        System.out.println("关闭宝马车载音响");
    }
}

提供抽象的工厂

 * @Description 产品工厂接口
 */
public interface ProductFactory {
    Car ProductCar();
    CarAudio ProductCarAudio();
}

提供具体的工厂

 * @Description 宝马工厂
 */
public class BaomaFactory implements ProductFactory{
 
    @Override
    public Car ProductCar() {
        return new BaomaCar();
    }
 
    @Override
    public CarAudio ProductCarAudio() {
        return new BaomaCarAudio();
    }
}
 * @Description aodi工厂
 */
public class AodiFactory implements ProductFactory{
    @Override
    public Car ProductCar() {
        return new AodiCar();
    }
 
    @Override
    public CarAudio ProductCarAudio() {
        return new AodiCarAudio();
    }
}

客户测试类

 * @Description 消费者类
 */
public class Customer {
    public static void main(String[] args) {
        System.out.println("--------奥迪系列---------");
        //获得奥迪工厂
        AodiFactory aodiFactory = new AodiFactory();
        Car car = aodiFactory.ProductCar();
        CarAudio carAudio = aodiFactory.ProductCarAudio();
        car.startCar();
        car.stopCar();
        carAudio.startCarAudio();
 
 
        System.out.println("--------宝马系列---------");
 
        BaomaFactory baomaFactory = new BaomaFactory();
        Car carBaoma = baomaFactory.ProductCar();
        CarAudio carAudioBaoma = baomaFactory.ProductCarAudio();
        carBaoma.stopCar();
        carBaoma.washCar();
        carAudioBaoma.startCarAudio();
 
    }
}

输出结果

        --------奥迪系列---------
启动奥迪车
关闭奥迪车
开启奥迪车载音响
--------宝马系列---------
停下宝马
洗宝马
打开宝马车载音响

idea中类图关系

如果我们要新增产品,需在总工厂去添加方法,而且其他的类也会修改,印证了我们之前写到的缺点,

总结一下:

抽象工厂模式就是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂

四、小结

工厂模式的核心本质

实例化对象不使用new,用工厂方法代替

将选择实现类,创建对象时统一管理和控制,从而将调用者跟我们的实现类解耦

简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)

工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)

抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: Java工厂模式的深入了解

本文链接: https://www.lsjlt.com/news/161680.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java工厂模式的深入了解
    目录一、简单工厂模式二、工厂方法模式三、抽象工厂模式3.1、抽象工厂模式的定义3.2、  抽象工厂模式的结构3.3抽象工厂模式代码示例四、小结一、简单工厂模式 何为简单工厂...
    99+
    2022-11-12
  • 深入了解GoLang中的工厂设计模式
    目录1. 定义2. 优点3. 代码实现3.1 普通工厂3.2 工厂方法3.3 抽象工厂1. 定义 工厂模式是一种创建型设计模式,有了工厂只需要知道要制造的东西名字,就能让对应工厂进行...
    99+
    2023-05-20
    GoLang工厂模式 Go工厂模式 GoLang设计模式工厂模式
  • Java深入探究讲解抽象工厂模式
    目录1. 抽象工厂模式解决2. 抽象工厂类图UML3. 抽象工厂模式的主要角色4. 代码实现5. 抽象工厂方法再探究6. 优缺点7. 适用示例解决工厂方法模式的问题:一个具体工厂只能...
    99+
    2022-11-13
  • Java深入探究讲解工厂方法模式
    目录1. 工厂方法模式介绍2. 工厂方法模式类图UML3. 工厂方法模式角色说明4. 代码实现5. 工厂模式再探究6. 优缺点7. 应用场景1. 工厂方法模式介绍 定义:工厂方法模式...
    99+
    2022-11-13
  • Java 深入探究讲解简单工厂模式
    目录1. 简单工厂介绍2. 简单工厂类图UML3. 简单工厂角色说明4. 代码实现5. 优缺点6. 使用场景1. 简单工厂介绍 简单工厂有一个具体的工厂类,可以生产不同的产品,属于创...
    99+
    2022-11-13
  • 深入理解Java设计模式之抽象工厂模式
    目录一、什么是抽象工厂模式二、抽象工厂模式的应用场景三、抽象工厂模式和工厂方法模式对比四、抽象工厂模式的优缺点五、抽象工厂模式的实现六、总结一、什么是抽象工厂模式 为创建一组相关或相...
    99+
    2022-11-12
  • 深入理解Java设计模式之简单工厂模式
    目录一、什么是简单工厂模式二、简单工厂模式的结构三、简单工厂模式的应用场景四、简单工厂模式和工厂方法模式区别五、简单工厂模式和策略模式的异同六、简单工厂模式的优缺点七、简单工厂模式的...
    99+
    2022-11-12
  • PHP设计模式中工厂模式深入详解
    目录简介简单工厂作用适用场景优点缺点代码工厂模式作用适用场景优点缺点代码抽象工厂作用适用场景优点缺点代码三者对比简介 工厂模式属于创建型模式,可以分为三种:简单工厂、工厂模式、抽象工...
    99+
    2022-11-13
    PHP工厂模式 PHP设计模式
  • Java创建型设计模式之工厂方法模式深入详解
    目录简单工厂模式定义产品对象创建工厂类工厂使用反射工厂方法模式概述应用场景优缺点主要角色工厂方法模式的基本使用创建抽象产品创建具体产品创建抽象工厂创建具体工厂客户端执行简单工厂模式 ...
    99+
    2022-11-13
  • Java 深入理解创建型设计模式之抽象工厂模式
    1.什么是抽象工厂模式? 抽象工厂模式:  定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。抽象工厂模式可以将简单工厂模式和工厂方法模式进...
    99+
    2022-11-13
  • Java工厂模式之简单工厂,工厂方法,抽象工厂模式详解
    目录1、简单工厂模式1.定义2.代码案例3.适用场景4.优缺点2、工厂方法模式1.定义2.代码案例3.适用场景4.优缺点3、抽象工厂模式1.定义2.代码案例3.适用场景4.优缺点4、...
    99+
    2022-11-13
  • Java代理模式的深入了解
    目录一、静态代理模式1.1、 代理模式的定义:1.2、代理模式的优缺点二、动态代理模式总结一、静态代理模式 1.1、 代理模式的定义: 由于某些原因需要给某对象提供一个代理以控制对该...
    99+
    2022-11-12
  • Java单例模式的深入了解
    目录一、设计模式概览1.1、软件设计模式的概念1.2、软件设计模式的基本要素1.3、GoF的23种设计模式的分类和功能1.4、软件设计的七大原则 二、单利模式1.1、单例模...
    99+
    2022-11-12
  • java简单工厂模式入门
    目录前言试例1. 创建饮料接口(或者抽象类)2. 具体饮料类的实现(可乐、雪碧)3. 饮料生产工厂类4. 工厂调用总结前言 定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创...
    99+
    2022-11-12
  • 深入剖析Java工厂模式让你的代码更灵活
    目录一、概述1.1 什么是Java工厂模式二、简单工厂2.1 什么是简单工厂2.2 示例代码2.3 优点和缺点三、工厂方法3.1 什么是工厂方法3.2 示例代码3.3 优点和缺点四、...
    99+
    2023-05-19
    Java 设计模式 工厂模式 Java工厂模式使用 Java工厂模式
  • Java观察者模式的深入了解
    目录一、观察者模式的定义和特点二、观察者模式的结构三、代码实例代码示例总结一、观察者模式的定义和特点 观察者模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时...
    99+
    2022-11-12
  • Java装饰者模式的深入了解
    目录一、装饰模式的定义和特点二、装饰模式的结构三、咖啡点单案例演示代码实例:四、总结总结一、装饰模式的定义和特点 在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些...
    99+
    2022-11-12
  • Java职责链模式的深入了解
    目录一、职责链模式的定义与特点二、职责链模式的结构三、职责链模式案例总结一、职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前...
    99+
    2022-11-12
  • Java设计模式之简单工厂 工厂方法 抽象工厂深度总结
    目录工厂模式介绍好处常见的应用简单工厂(Simple Factory)适用场景角色分配:应用案例:优缺点:简单工厂实现:工厂方法(Factory Method)适用场景角色分配:应用...
    99+
    2022-11-12
  • 深入了解Java设计模式之策略模式
    目录定义解决的问题核心要点类图溢出效用代码实现核心接口实现类-三个Context类Main方法拓展JDK源码Spring源码定义 定义了算法家族,分别封装起来,让他们之间可以相互替换...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作