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

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

作者头像
好好学java
发布于 2018-09-21 07:41:30
发布于 2018-09-21 07:41:30
62700
代码可运行
举报
运行总次数: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
2020
简单工厂模式都不会,你真应该去工厂搬砖!
设计模式一:简单工厂模式
简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)。简单工厂模式是由一个工厂对象决定创建哪一种产品类实例。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为不同工厂模式的一个特殊实现
对弈
2019/09/29
4080
设计模式一:简单工厂模式
学会工厂方法模式,搬起砖头更加给力!
在介绍简单工厂方法模式时Jungle总结出简单工厂模式存在最大的问题是违背了“开闭原则”,每当增加新的产品时,需要修改工厂类的逻辑。为了规避这种不足,同时很好的利用简单工厂模式的优点,本节Jungle将声情并茂地为您奉上工厂方法模式。
用户6557940
2022/07/24
1920
学会工厂方法模式,搬起砖头更加给力!
抽象工厂模式——工厂方法的大结局
回顾之前的设计模式,简单工厂模式所有逻辑都封装在工厂类中,工厂根据客户提供的产品名字创建对应产品的对象实例;工厂方法模式将产品的创建过程放到了具体工厂类中,每一个工厂可以创建一个具体产品,由此可能会创建许多工厂类。很多时候,一个工厂不只是生产一种产品,而是生产一类产品,比如一个体育用品工厂,可以生产篮球、足球、排球等多种产品。此时我们可以把这些相关的产品归纳为一个“产品族”,由同一个工厂来生产,这即是Jungle今天要学习的抽象工厂模式。
用户6557940
2022/07/24
5540
抽象工厂模式——工厂方法的大结局
简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
全栈程序员站长
2021/12/12
2840
简单工厂模式
设计模式之工厂模式!深入解析简单工厂模式,工厂方法模式和抽象工厂模式
工厂模式 创建型模式: 对类的实例化过程进行抽象,能够将对象的创建和对象的使用分离开来 为了使得软件的结构更加清晰,外界对于这些对象使用只需要知道共同的接口,而不在意具体实现的细节,这样使得整个系统更加符合单一职责的原则 创建型模式隐藏了类的实例的创建细节,通过隐藏对象创建和组合过程从而使得整个系统相互独立的目的 创建型模式在创建什么,由谁创建,何时创建更加灵活 工厂模式是一个重要的创建型模式,主要功能就是实例化对象 工厂模式: 负责将有共同接口的类实例化 主要解决接口选择问题 在不同的条件下需要创建
攻城狮Chova
2022/03/24
4650
设计模式之工厂模式!深入解析简单工厂模式,工厂方法模式和抽象工厂模式
设计模式---工厂模式
简单工厂模式属于类的创新型模式,又叫静态工厂方法模式,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
大忽悠爱学习
2021/11/15
3850
小谈设计模式(2)—简单工厂模式
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
学编程的小程
2023/10/11
2280
小谈设计模式(2)—简单工厂模式
【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
简单工厂模式优点 : 只需要传入 正确的参数 , 就可以 获取需要的对象 , 无需知道创建细节 ; 工厂类中有必要的 判断逻辑 , 可以决定 根据当前的参数 创建对应的产品实例 , 客户端可以免除直接创建产品对象的责任 ; 通过该模式 , 实现了对 创建实例 和 使用实例 的 责任分割 ; 提供专门的 工厂类 用于创建对象 , 客户端 无需知道所创建的产品类的类名 , 只需要知道对应产品类的参数即可创建对象实例 ;
韩曙亮
2023/03/29
7740
【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
Java设计模式-工厂模式(1)简单工厂模式
设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。
宁在春
2022/10/31
3030
Java设计模式-工厂模式(1)简单工厂模式
设计模式 | 简单工厂模式及典型应用
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。
小旋锋
2019/01/21
1.3K0
JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
秃头哥编程
2019/06/05
8980
JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
一起学习设计模式--02.简单工厂模式
工厂模式是最常用的一类创建型设计模式。我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。
独立观察员
2022/12/06
3220
一起学习设计模式--02.简单工厂模式
Java设计模式学习记录-简单工厂模式、工厂方法模式
之前介绍了设计模式的原则和分类等概述。今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍。
纪莫
2018/07/24
3030
Java设计模式学习记录-简单工厂模式、工厂方法模式
设计模式之简单工厂模式
简单工厂模式 Simple Factory Pattern 也叫静态工厂方法模式 Static Factory Method Pattern,隶属于设计模式中的创建型模式。简单工厂通过一个静态方法来给使用方提供类创建的方式,将对象创建的控制权由使用方转换到提供方,可以将使用方和提供方具体的实现解耦,提供方就可以在用户无感知的情况下进行具体实现的替换。
Dylan Liu
2019/08/05
3660
设计模式-简单工厂模式
模式定义 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式定义了一个创建对象的类,由这个类来封装实例化
武培轩
2018/04/18
6590
设计模式-简单工厂模式
「聊设计模式」之简单工厂模式(Simple Factory)
🏆本文收录于 《聊设计模式》 专栏,专门攻坚指数级提升,助你一臂之力,早日登顶🚀,欢迎持续关注&&收藏&&订阅!
bug菌
2023/10/30
7222
「聊设计模式」之简单工厂模式(Simple Factory)
设计模式 - 简单工厂模式
在这个问题中,沙发上的你,是苹果对象的使用者。超市(果农场)是苹果对象的生产者,可以理解为工厂。
子乾建建-Jeff
2020/06/29
4550
设计模式 - 简单工厂模式
『设计模式』简单工厂模式
简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的“消费”和生产完全分开,客户端只需要知道自己需要什么产品,如何来使用产品就可以了,具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。
风骨散人Chiam
2020/10/28
3710
简单工厂模式
public static Product GetProduct(string arg)
大龄老码农-昊然
2021/05/07
4930
简单工厂模式
推荐阅读
相关推荐
简单工厂模式都不会,你真应该去工厂搬砖!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档