java工厂模式之总有你想不到的知识(代码片段)

流楚丶格念 流楚丶格念     2023-03-15     683

关键词:

文章目录

Java工厂模式

概念

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式在一般分为三类:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(Abstract Factory)

这三种模式从上到下逐步抽象,并且更具一般性

三种工厂模式

简单工厂模式

简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。

它存在的目的很简单:定义一个用于创建对象的接口,先来看看它的组成:

角色说明
1)工厂类角色这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现
2)抽象产品角色它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3)具体产品角色工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

代码示例

定义一个抽象产品 Car接口,定义三个具体产品角色类:奔驰、宝马、奥迪实现接口

package com.shixun.design.factory;

/**
 * 抽象产品 Car接口
 */
public interface Car 
    void show();


/**
 * 新增的类Aodi
 */
public class AodiCar implements Car
    @Override
    public void show() 
        System.out.println("我是Aodi");
    


/**
 * BenzCar具体产品
 */
public class BenzCar implements Car 
    @Override
    public void show() 
        System.out.println("我是Benz");
    


/**
 * BmwCar具体产品
 */
public class BmwCar implements Car 
    @Override
    public void show() 
        System.out.println("我是Bmw");
    

编写简单工厂用于生产汽车

package com.shixun.design.factory.simple_factory;

import com.shixun.design.factory.AodiCar;
import com.shixun.design.factory.BenzCar;
import com.shixun.design.factory.BmwCar;
import com.shixun.design.factory.Car;

/**
 * 简单工厂类
 */
public class SimpleFactory 
    /**
     * 生产汽车(屏蔽生产汽车细节)
     *
     * @param carName 汽车的名称
     * @return
     */
    public static Car produceCar(String carName) 
        //equalsIgnoreCase 忽略大小写 字符串比较相等
        if ("Benz".equalsIgnoreCase(carName)) 
            return new BenzCar();
         else if ("Bmw".equalsIgnoreCase(carName)) 
            return new BmwCar();
         else if ("Aodi".equalsIgnoreCase(carName)) 
            return new AodiCar();
         else 
            throw new RuntimeException("未知类型");
        
    

    public static void main(String[] args) 
        Car bmw = SimpleFactory.produceCar("bmw");
        bmw.show();
        Car aodi = SimpleFactory.produceCar("aodi");
        aodi.show();
        Car benz = SimpleFactory.produceCar("Benz");
        benz.show();
    

运行结果如下:

使用了简单工厂模式后,我们的程序更加符合现实中的情况;而且客户端免除了直接创建产品对象的责任,而仅仅负责“消费”产品。

从开闭原则上来分析简单工厂模式
当工厂生产一新辆车的时候,只要符合抽象产品制定的规定,所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一辆新车, 都要在工厂类中增加相应的业务逻辑或者判断逻辑,这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。

工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

也就是说交给了一个抽象工厂的子类(具体工厂)去实例化产品

来看下它的组成:

角色说明
1)抽象工厂角色工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。 在java中它由抽象类或者接口来实现
2)具体工厂角色含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象
3)抽象产品角色它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现
4)具体产品角色具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所 说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来:当有新的产品产生时,只要按照 抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代 码。可以看出工厂角色的结构也是符合开闭原则的

代码示例

定义一个抽象产品 Car接口,定义三个具体产品角色类:奔驰、宝马、奥迪实现接口

package com.shixun.design.factory;

/**
 * 抽象产品 Car接口
 */
public interface Car 
    void show();


/**
 * 新增的类Aodi
 */
public class AodiCar implements Car
    @Override
    public void show() 
        System.out.println("我是Aodi");
    


/**
 * BenzCar具体产品
 */
public class BenzCar implements Car 
    @Override
    public void show() 
        System.out.println("我是Benz");
    


/**
 * BmwCar具体产品
 */
public class BmwCar implements Car 
    @Override
    public void show() 
        System.out.println("我是Bmw");
    

定义一个抽象工厂:

package com.shixun.design.factory.factory_method;

import com.shixun.design.factory.Car;

/**
 * 工厂(抽象工厂)
 */
public interface Factory 
    Car produceCar();

定义三个具体工厂角色:

package com.shixun.design.factory.factory_method;

import com.shixun.design.factory.AodiCar;
import com.shixun.design.factory.Car;

/**
 * Aodi工厂(具体工厂角色)
 */
public class AodiFactory implements Factory 
    @Override
    public Car produceCar() 
        return new AodiCar();
    


package com.shixun.design.factory.factory_method;

import com.shixun.design.factory.BenzCar;
import com.shixun.design.factory.Car;

/**
 * Benz工厂(具体工厂角色)
 */
public class BenzFactory implements Factory 
    @Override
    public Car produceCar() 
        return new BenzCar();
    


package com.shixun.design.factory.factory_method;

import com.shixun.design.factory.BmwCar;
import com.shixun.design.factory.Car;

/**
 * Bmw工厂(具体工厂角色)
 */
public class BmwFactory implements Factory 
    @Override
    public Car produceCar() 
        return new BmwCar();
    


定义测试类生产三个产品:

package com.shixun.design.factory.factory_method;

import com.shixun.design.factory.Car;

/**
 * 使用者
 */
public class Test 
    public static void main(String[] args) 
        //生产Bmw
        BmwFactory bmwFactory = new BmwFactory();
        Car bmw = bmwFactory.produceCar();
        bmw.show();

        //生产Benz
        BenzFactory benzFactory = new BenzFactory();
        Car benz = benzFactory.produceCar();
        benz.show();

        //生产Aodi
        AodiFactory aodiFactory = new AodiFactory();
        Car aodi = aodiFactory.produceCar();
        aodi.show();
    


运行结果如下:

抽象工厂模式

内容过多,请参考另一篇博文:https://blog.csdn.net/weixin_45525272/article/details/126317048

工厂模式优缺点

优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
3、屏蔽产品的具体实现,调用者只关心产品的接口

缺点:

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

java策略模式之总有你想不到的知识(代码片段)

文章目录策略模式概念代码示例优缺点策略模式优点策略模式缺点应用场景综合实战:多个算法切换策略模式概念策略模式(StrategyPattern)也叫政策模式,是一种比较简单的模式。它的目的是定义一组算法,... 查看详情

java单例模式之总有你想不到的知识(代码片段)

文章目录Java单例模式概念满足条件两种形式设计要求饿汉模式懒汉方式懒汉式多线程解决方案synchronized双检查锁方式静态内部类枚举(别瞎用)Java单例模式概念单例模式是Java中最简单的设计模式之一。这种类型的设计... 查看详情

java责任链模式之总有你想不到的知识(代码片段)

文章目录责任链模式概念代码案例:优缺点优点缺点应用场景应用案例:多级处理责任链模式概念责任链模式(ChainofResponsibilityPattern)是一种常见的行为模式,它的目的是使多个对象都有机会处理请求,... 查看详情

java观察者模式之总有你想不到的知识(代码片段)

文章目录观察者模式概念代码案例:优缺点优点缺点应用场景观察者模式概念观察者模式(ObserverPattern)也称发布订阅模式,它的目的是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则... 查看详情

java单例模式之总有你想不到的知识

文章目录Java单例模式单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式单例模式确保在一个应用程序中某一个类只有一个实例,而且自行实例化并向整个系统提供... 查看详情

深入jdk源码,这里总有你不知道的知识点!

Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础。我们下面将总结和分析一下lang包下面最为基础和常用的几个部分。1:常用... 查看详情

设计模式---工厂模式(代码片段)

工厂模式简单工厂模式介绍角色简单工厂模式深入分析:代码演示优点缺点适用场景参考文章工厂方法模式介绍角色工厂方法模式深入分析代码演示工厂方法模式总结工厂方法模式的主要优点工厂方法模式的主要缺点适用场... 查看详情

166个最常用的linux命令汇总,总有你需要用到的!(代码片段)

我是二黑,一个快要秃头的测试人欢迎点赞收藏⭐留言如有错误敬请指正!我收集了一些软件测试资料,关注我公众号:程序员二黑,免费领取!最困难的时候,也就是我们离成功不远的时候!文... 查看详情

mybatis源码剖析:使用了工厂模式构建者模式动态代理模式等等知识实现对mybatis的自定义(代码片段)

MyBatis源码剖析1MyBatis框架概述mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。mybatis通过xml或... 查看详情

java设计模式——工厂模式(代码片段)

Java设计模式——工厂模式工厂模式(FactoryPattern)属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。术业... 查看详情

java设计模式——工厂模式简单工厂模式工厂方法模式抽象工厂模式(代码片段)

目录简单工厂模式传统方式简单工厂模式静态工厂模式工厂方法模式抽象工厂模式工厂模式JDK-Calendar源码分析工厂模式小结简单工厂模式 看一个具体的需求看一个披萨的项目:要便于披萨种类的扩展,要便于维护(1)... 查看详情

十家大厂,两百多道android面试题,总有你需要的(代码片段)

直接上正题:京东,字节跳动,美团,哔哩哔哩,声网,掌门教育,传音控股,得物,哈啰出行,小红书,其他厂经典题。前言前段时间在看机会,本文就是我对求职过程的一个总结... 查看详情

设计模式java工厂模式与应用(代码片段)

Java工厂模式与应用摘要本文通过对静态工厂进行简单的介绍。并介绍与实现其与其他两种设计模式——单例模式与享元模式,的组合实现,以达到特定的功能实现。文章目录Java工厂模式与应用摘要一.简单工厂模式简介... 查看详情

java设计模式--工厂方法模式(代码片段)

工厂方法模式工厂方法模式也属于对象创建型模式,工厂方法模式主要是用于定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法模式主要作用是将一个类的实例化过程放到它的子类中。 工厂方法模式的适用性... 查看详情

设计模式-工厂方法模式(代码片段)

整理了一下基础知识,之前做银行系统时比较频繁的用过工厂方法。//first,weneedtocreateaLoanTypeabstractclassabstractclassLoanTypeprotecteddoublerate;abstractvoidgetRate();publicvoidcalculateAmount(intunits)System.out.println(rate*un 查看详情

java设计模式之工厂模式(简单工厂模式+工厂方法模式)(代码片段)

  在面向对象编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下,new操作符直接生成对象会带来一些问题。  举例来说,许多类型对象的创造需要一系列的... 查看详情

java面试知识点整理,你还看不明白?(代码片段)

1.简单工厂(非23种设计模式中的一种)实现方式:BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来... 查看详情

java设计模式之简单工厂模式(代码片段)

定义:简单工厂模式又叫作静态工厂方法模式,简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式,应用场景:对于产品种类相对较少的情况下,考虑... 查看详情