Java工厂模式的深入了解

目录
  • 一、简单工厂模式
  • 二、工厂方法模式
  • 三、抽象工厂模式
    • 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,用工厂方法代替

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

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

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

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

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

(0)

相关推荐

  • Java设计模式之职责链模式详解

    目录 前言 一.职责链模式的定义与特点 二.职责链模式的结构 三.职责链模式案例 前言 本文简单介绍了设计模式的一种--职责链模式  一.职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止. 比如我们的审批制度,低等级的审批不了的,交给上一级审批,依次类推,直到审批结束. 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处

  • Java代理模式的深入了解

    目录 一.静态代理模式 1.1. 代理模式的定义: 1.2.代理模式的优缺点 二.动态代理模式 总结 一.静态代理模式 1.1. 代理模式的定义: 由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 比如在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象.例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买.又如

  • Java观察者模式的深入了解

    目录 一.观察者模式的定义和特点 二.观察者模式的结构 三.代码实例 代码示例 总结 一.观察者模式的定义和特点 观察者模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模型-视图模式,它是对象行为型模式. 特点: 1.降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系.符合依赖倒置原则. 2.目标与观察者之间建立了一套触发机制. 二.观察者模式的结构 实现观察者模式时要注意具体目标对象和

  • Java装饰者模式的深入了解

    目录 一.装饰模式的定义和特点 二.装饰模式的结构 三.咖啡点单案例演示 代码实例: 四.总结 总结 一.装饰模式的定义和特点 在软件开发过程中,有时想用一些现存的组件.这些组件可能只是完成了一些核心功能.但在不改变其结构的情况下,可以动态地扩展其功能.所有这些都可以釆用装饰器模式来实现. 就像我们做菜,需要用到调料,菜,刀,火等一系列抽象的组件来最终完成一道菜. 装饰模式的定义: 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式.就增加

  • Java职责链模式的深入了解

    目录 一.职责链模式的定义与特点 二.职责链模式的结构 三.职责链模式案例 总结 一.职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止. 比如我们的审批制度,低等级的审批不了的,交给上一级审批,依次类推,直到审批结束. 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递.所以责任

  • 深入理解Java设计模式之职责链模式

    目录 一.什么是职责链模式 二.职责链模式的结构 四.职责链模式的使用场景 五.职责链模式的实现 一.什么是职责链模式 二.职责链模式的结构 四.职责链模式的使用场景 五.职责链模式的实现 六.总结 六.总结 一.什么是职责链模式 客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象.这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链.使编程更有灵活性. 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.

  • Java单例模式的深入了解

    目录 一.设计模式概览 1.1.软件设计模式的概念 1.2.软件设计模式的基本要素 1.3.GoF 的 23 种设计模式的分类和功能 1.4.软件设计的七大原则 二.单利模式 1.1.单例模式的相关定义 1.2.单利模式的结构 2.1单利模式的实现方式一:懒汉式 2.2单利模式的实现方式一:饿汉式 总结 一.设计模式概览 1.1.软件设计模式的概念 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.它

  • java 工厂模式的讲解及优缺点的介绍

    简单工厂模式介绍: 概要: 简单工厂模式,又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,把产品的生产方法封装起来放进工厂类,工厂类可以根据参数的不同返回不同产品类的实例.工厂类就是用来生产产品的类,把生产产品的方法放到工厂类里面去,工厂类里面用switch语句控制生产哪种商品,使用者只需要调用工厂类的静态方法就可以实现产品类的实例化. 实现代码: package scut.designmodel.SimpleFactoryPatter

  • java 工厂模式的实例详解

    java 工厂模式的实例详解 工厂方法中的"工厂"和我们平常理解的一样:用于生产产品. 而客户是要和产品打交道,所以工厂方法模式的意义在于把客户和产品分开,达到解耦和更灵活的目的. 一般我们有一个产品的抽象类,然后有几个具体的产品,如下: //抽象产品角色 public interface Product{ void product(); } //具体产品1 public class Pro1 implements Product{ @Override public void prod

  • 23种设计模式(2) java工厂模式

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式根据抽象程度的不同分为三种: 简单工厂模式(也叫静态工厂模式) 工厂方法模式(也叫多形性工厂) 抽象工厂模式(也叫工具箱) 简单工厂模式 实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接

  • Java工厂模式定义与用法实例分析

    本文实例讲述了Java工厂模式定义与用法.分享给大家供大家参考,具体如下: 一 代码 // 抽象产品 interface Block { public void print(); } // 具体产品 class IBlock implements Block { @Override public void print() { System.out.println("我是一个I形的方块!"); } } // 具体产品 class LBlock implements Block { @Ov

  • Java工厂模式用法之如何动态选择对象详解

    目录 前言 小菜鸟的问题 有没有更好的方法呢 还有什么更好的办法吗 还能做得更好吗 如何在 SpringBoot 中实现此技术 总结 前言 工厂设计模式可能是最常用的设计模式之一,我想大家在自己的项目中都用到过.可能你会不屑一顾,但这篇文章不仅仅是关于工厂模式的基本知识,更是讨论如何在运行时动态选择不同的方法进行执行,你们可以看看是不是和你们项目中用的一样? 小菜鸟的问题 直接上例子说明,设计一个日志记录的功能,但是支持记录到不同的地方,例如: 内存中 磁盘上的文件 数据库 百度网盘等远程存储服

  • 一篇文章带你入门java工厂模式

    目录 总结: Java设计模式-工厂模式 什么是工厂模式? 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 简单编写一个类: 1.简单工厂模式 本程序非常简单就是通过接口的子类为接口对象实例化,但是本操作存在什么样的问题呢? 之前一直在强调,主方法或者是主类是一个客户端,客户端的操作应该越简单

  • 轻松掌握Java工厂模式、抽象工厂模式

    在面向对象编程的程序设计中,我们最常见的操作就是new对象,但在创建一个新对象的过程中,会有一些问题,比如我们需要注意创建新对象的实现细节,初始化一些必要的参数等.这样会让我们在讲更多的心思放在对象的创建上,而不是程序逻辑的实现上,严重拖延了我们的程序开发效率.工厂模式和抽象工厂模式的出现则完美解决了这个问题,让我们不再关心对象的创建,更多的在重心放在业务的实现上. 特点: 1.程序员直接通过工厂方法创建对象,不再关注创建对象的细节. 2.隐藏对象的实现细节,也有利于程序的安全性. 3.降低程序

  • Java工厂模式的深入了解

    目录 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 3.1.抽象工厂模式的定义 3.2.  抽象工厂模式的结构 3.3抽象工厂模式代码示例 四.小结 一.简单工厂模式 何为简单工厂模式? 首先先通过一个案例来理解 我有一个需求,要买车,买车有不同的型号,那么我们常见的做法就是我买车点有什么车我就买什么车,实例如下 定义一个车接口 public interface Car { void name(); } 定义一个实现类,例如宝马 public class Baoma implements

  • Java工厂模式之简单工厂,工厂方法,抽象工厂模式详解

    目录 1.简单工厂模式 1.定义 2.代码案例 3.适用场景 4.优缺点 2.工厂方法模式 1.定义 2.代码案例 3.适用场景 4.优缺点 3.抽象工厂模式 1.定义 2.代码案例 3.适用场景 4.优缺点 4.总结 1.简单工厂模式 1.定义 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例.属于创建型模式,但它不属于GOF23种设计模式. 2.代码案例 假设以罐头产品的制造为案例 第一步:定义罐头的顶层接口类ICanned /**

  • Java设计模式之工厂模式(Factory模式)介绍

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量. 我们以类Sample为例,

随机推荐