Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >轻松看懂java设计模式简单工厂模式

轻松看懂java设计模式简单工厂模式

作者头像
好好学java
发布于 2018-09-21 07:41:30
发布于 2018-09-21 07:41:30
63300
代码可运行
举报
运行总次数:0
代码可运行

一、什么是简单工厂模式

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

二、简单工厂模式的角色和职责

1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象

三、简单工厂模式的UML图

sports:抽象角色

Basketball和Football:具体产品角色

sportsFactory:工厂角色

四、简单工厂模式代码

这个例子,用运动作为抽象角色,足球和篮球作为具体的产品角色来讲解,下面看具体代码。

首先我们创建一个抽象类sports,同时有一个运动的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Sports {
    /*
     * 运动
     */
    public void play();
}

然后,定义了一个足球类篮球类,同样有运动方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Basketball implements Sports{
    /*
     * 运动
     */
    public void play(){
        System.out.println("打篮球...");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Football implements Sports{
    /*
     * 运动
     */
    public void play(){
        System.out.println("踢足球啦...");
    }
}

最后写一个工厂类,用来创造足球运动篮球运动

这里创建的方式有很多种方式,我们从简单的开始,逐步优化代码。

4.1、单独创建实例方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SportsFactory {
    /*
     * 获得Basketball类的实例

    public static  Sports getBasketball() {
        return new Basketball();
    }

    /*
     * 获得Football类实例
     */
    public static Sports getFootball() {
        return new Football();
    }
}

这种方法,直接用两个不同的方法直接创建两个实例对象。

4.2、逻辑判断的方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SportsFactory {

    /*
     * getSports方法,获得所有产品对象
     */
    public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        if(type.equalsIgnoreCase("Basketball")) {
            return Basketball.class.newInstance();

        } else if(type.equalsIgnoreCase("Football")) {
            return Football.class.newInstance();
        } else {
            System.out.println("找不到相应的实例化类");
            return null;
        }

    }
}

先传入一个类型参数,然后判断,再用反射的方式返回对象。

前面这两种方式都不是最优的方式,因为他们都违背了开闭原则

开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。这个原则有两个特性,一个是说“对于扩展是开放的”,另一个是说“对于更改是封闭的”。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在。

下面,我们再优化一下。

4.3、反射实现方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SportsFactory {

    /*
     * getSports方法,获得所有产品对象
     */
    public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

        Class Sports = Class.forName(type);
        return (Sports) Sports.newInstance();

    }
}

这种方法,通过反射的方式实现,不管我们还需要扩展什么其他功能都不用再更改这个工厂类的代码了,所以就符合开闭原则了。

五、测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainClass {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    //方法一测试
//        //实例化一个Basketball
//        Basketball Basketball = new Basketball();
//        //实例化一个Football
//        Football Football = new Football();
//        
//        Basketball.play();
//        Football.play();

        //方法二测试
//        //实例化一个Basketball,用到了多态
//        Sports Basketball = new Basketball();
//        Sports Football = new Football();
//        Basketball.play();
//        Football.play();

//        //实例化一个Basketball
//        Sports Basketball = SportsFactory.playBasketball();
//        Sports Football = SportsFactory.playFootball();
//        Basketball.play();
//        Football.play();

        //方法三测试
        Sports Basketball = SportsFactory.getSports("Basketball");
        Sports Football = SportsFactory.getSports("Football");
        Basketball.play();
        Football.play();

    }
}

运行结果:

六、简单工厂模式应用场景

优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化

缺点:由于工厂类集中了所有实例的创建逻辑,违反了开闭原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

觉得有用就转发分享一下吧

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 好好学java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
简单工厂模式都不会,你真应该去工厂搬砖!
创建型模式关注对象的创建过程,在软件开发中应用非常广泛。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象过程中无须关心对象的创建细节,从而降低系统耦合度,并且让系统易于修改和扩展。
用户6557940
2022/07/24
2120
简单工厂模式都不会,你真应该去工厂搬砖!
学会工厂方法模式,搬起砖头更加给力!
在介绍简单工厂方法模式时Jungle总结出简单工厂模式存在最大的问题是违背了“开闭原则”,每当增加新的产品时,需要修改工厂类的逻辑。为了规避这种不足,同时很好的利用简单工厂模式的优点,本节Jungle将声情并茂地为您奉上工厂方法模式。
用户6557940
2022/07/24
2000
学会工厂方法模式,搬起砖头更加给力!
设计模式之简单工厂模式
简单工厂模式 Simple Factory Pattern 也叫静态工厂方法模式 Static Factory Method Pattern,隶属于设计模式中的创建型模式。简单工厂通过一个静态方法来给使用方提供类创建的方式,将对象创建的控制权由使用方转换到提供方,可以将使用方和提供方具体的实现解耦,提供方就可以在用户无感知的情况下进行具体实现的替换。
Dylan Liu
2019/08/05
3710
「聊设计模式」之简单工厂模式(Simple Factory)
🏆本文收录于 《聊设计模式》 专栏,专门攻坚指数级提升,助你一臂之力,早日登顶🚀,欢迎持续关注&&收藏&&订阅!
bug菌
2023/10/30
7342
「聊设计模式」之简单工厂模式(Simple Factory)
【设计模式】-创建型模式-第2章第2讲-【工厂模式】
2.1、案例场景:假设有一个汽车工厂,目前只生产两种车型,小型跑车和大型家用车。顾客决定买小还是大型。
跟着飞哥学编程
2022/12/02
2940
Java设计模式学习记录-简单工厂模式、工厂方法模式
之前介绍了设计模式的原则和分类等概述。今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍。
纪莫
2018/07/24
3160
Java设计模式学习记录-简单工厂模式、工厂方法模式
简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
全栈程序员站长
2021/12/12
2930
简单工厂模式
详解设计模式:简单工厂模式
工厂方法是一种十分常用的创建型设计模式,它在父类中提供了创建对象的接口但允许子类更改将要创建的对象的类型。
栗筝i
2022/12/02
3820
详解设计模式:简单工厂模式
Java设计模式-工厂模式(1)简单工厂模式
设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。
宁在春
2022/10/31
3160
Java设计模式-工厂模式(1)简单工厂模式
抽象工厂模式——工厂方法的大结局
回顾之前的设计模式,简单工厂模式所有逻辑都封装在工厂类中,工厂根据客户提供的产品名字创建对应产品的对象实例;工厂方法模式将产品的创建过程放到了具体工厂类中,每一个工厂可以创建一个具体产品,由此可能会创建许多工厂类。很多时候,一个工厂不只是生产一种产品,而是生产一类产品,比如一个体育用品工厂,可以生产篮球、足球、排球等多种产品。此时我们可以把这些相关的产品归纳为一个“产品族”,由同一个工厂来生产,这即是Jungle今天要学习的抽象工厂模式。
用户6557940
2022/07/24
5700
抽象工厂模式——工厂方法的大结局
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
在软件设计中,工厂模式是一种常见的设计模式,它提供了一种创建对象的最佳方式。通过工厂模式,我们可以将对象的创建逻辑与使用逻辑分离,降低代码的耦合度,提高系统的可扩展性和可维护性。
公众号:码到三十五
2024/03/19
2470
Java设计模式-工厂模式
简单来说工厂模式就是帮助我们创建对象,隐藏了对象创建过程的复杂度(如类B需要调用类A,工厂类提供A类的创建接口,B只需要调用接口传入相应参数即可)、避免你辛苦的准备构造方法的参数。说白了--就是工厂提供产品给客户(按照提供的方式不同分成三类:简单工厂、工厂、抽象工厂) 具体简介看下面:
蒋老湿
2020/01/03
5920
设计模式-简单工厂
使用工厂方法模式可以应付我们遇到的大部分需求,当产品种类变多的时候,这个时候会出现大量的工厂类,怎么解决这个问题?可以对产品树上类似的种类使用简单工厂模式来实现。也就是说 工厂方法+简单工厂= 抽象工厂。
王小明_HIT
2020/11/11
3660
设计模式一:简单工厂模式
简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)。简单工厂模式是由一个工厂对象决定创建哪一种产品类实例。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为不同工厂模式的一个特殊实现
对弈
2019/09/29
4170
设计模式一:简单工厂模式
小谈设计模式(2)—简单工厂模式
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
学编程的小程
2023/10/11
2330
小谈设计模式(2)—简单工厂模式
设计模式-简单工厂模式
模式定义 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式定义了一个创建对象的类,由这个类来封装实例化
武培轩
2018/04/18
6730
设计模式-简单工厂模式
一起学习设计模式--02.简单工厂模式
工厂模式是最常用的一类创建型设计模式。我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。
独立观察员
2022/12/06
3310
一起学习设计模式--02.简单工厂模式
设计模式--简单工厂模式
简单工厂模式是一种创建型模式,它可以根据参数的不同返回不同类的实例,通常用一个静态方法来实现工厂的功能,这个方法就叫做简单工厂。简单工厂模式的优点是可以将对象的创建和使用分离,降低客户端的复杂度;缺点是不符合开闭原则,如果要增加新的产品类,就需要修改工厂类的代码。
软件架构师Michael
2023/06/13
2790
『设计模式』简单工厂模式
简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的“消费”和生产完全分开,客户端只需要知道自己需要什么产品,如何来使用产品就可以了,具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。
风骨散人Chiam
2020/10/28
3810
设计模式 - 简单工厂模式
在这个问题中,沙发上的你,是苹果对象的使用者。超市(果农场)是苹果对象的生产者,可以理解为工厂。
子乾建建-Jeff
2020/06/29
4650
设计模式 - 简单工厂模式
相关推荐
简单工厂模式都不会,你真应该去工厂搬砖!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验