Java十分钟精通进阶简单工厂模式

目录
  • 1、什么是工厂模式?
    • 工厂模式的定义:
  • 2、简单工厂模式优点和缺点
  • 3、简单工厂的代码实现
  • 4、小结

1、什么是工厂模式?

工厂模式的定义:

定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康。我们可以看到工厂的变化趋势,但是对于我们来说,看到是越简单越好,也就是工厂更智能化。

其实凡是需要生成复杂对象的地方,都可以尝试考虑使用工厂模式来代替。

我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。

简单的说:

简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式

注意:

但是简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了开闭原则。

简单工厂模式的结构图:

2、简单工厂模式优点和缺点

优点:

  • 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确
  • 客户端无需知道所创建具体产品的类名,只需知道参数即可
  • 可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类

缺点:

  • 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则
  • 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
  • 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
  • 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构

3、简单工厂的代码实现

可乐工厂:

现在我们有一个可乐工厂,可以生产可乐:可口可乐、百事可乐、无糖可乐(目前暂定三种)

先定义一个可乐接口:

/**
 * 我们有一个可乐工厂
 */

public interface Cola {

    //生产可乐的方法
    public void cola();
}

定义可口可乐的方法,实现可乐接口,重写方法:

/**
 * 可口可乐
 */

public class CocaCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产可口可乐");
    }
}

定义百事可乐的方法,实现可乐接口,重写方法:

/**
 *
 * 百事可乐
 */

public class PepsiCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产百事可乐");
    }
}

定义无糖可乐的方法,实现可乐接口,重写方法:

/**
 * 五无糖可乐
 */

public class SugarFreeCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产无糖可乐");
    }
}

OK,接着我们先按照之前普通的方法实现功能,也就是在模拟客户端(测试类)中建立对象,使用方法的方式来实现:

/**
 *普通实现方法
 */

public class Test {
    public static void main(String[] args) {

        Cola c1 = new CocaCola();
        Cola c2 = new PepsiCola();
        Cola c3 = new SugarFreeCola();

        c1.cola();
        c2.cola();
        c3.cola();
    }
}

输出:

开始生产可口可乐
开始生产百事可乐
开始生产无糖可乐

这样是没有问题的。但是这个方法相当于在测试类中实现了对象并使用了方法,虽然很好的完成了任务,但是,我们的三个实现类和和接口紧密的绑定到了一起,这意味着我们的代码耦合出现严重问题,不利于以后的维护。

方案: 我们可以在客户端和具体实现方法之间添加一个简单工厂:

/**
 *可乐工厂
 * 在这里可以生产无糖可乐、百事可乐、可口可乐
 */

public class ColaFactory {

    //给每个产品定一个编号
    public static final int PepsiCola = 1; //百事
    public static final int CocaCola = 2;  //可口
    public static final int SugarFreeCola = 3; //无糖

    //通过编号来确定产品对象
    public static Cola getCola(int num){
        switch (num){
            case 1:
                return new PepsiCola();
            case 2:
                return new CocaCola();
            case 3:
                return new SugarFreeCola();
            default:
                return null;
        }
    }
}

测试类:

public class Test2 {
    public static void main(String[] args) {

		//只要在这个方法捏传入需要对象的参数,即可得到
        Cola c = ColaFactory.getCola(3); //参数按需传入
        c.cola();

    }
}

当传入3时:

开始生产无糖可乐

如果在后期需要添加产品,直接在工厂内添加选择即可,通过方法和参数就可以获取到

其他写法:

我们可以不用预先设置产品的编号,也可以直接输入产品名称:

/**
 * 另一种工厂写法
 */
public class ColaFactoryTest {

    public static Cola getCola(String name){
        if("无糖可乐".equals(name)){
            return new SugarFreeCola();
        }else if ("百事可乐".equals(name)){
            return new PepsiCola();
        }else if("可口可乐".equals(name)){
            return new CocaCola();
        }else {
            return null;
        }
    }
}

测试类:

public class Test3 {
    public static void main(String[] args) {

        Cola c = ColaFactoryTest.getCola("百事可乐");
        c.cola();

    }
}

输出:

开始生产百事可乐

这样也是没问题的,大家可以喜欢用自己喜欢的方式即可。

4、小结

简单的工厂模式就是这样,符合创建与使用相分离的特点,但是缺点也显而易见,就是每次需要增加新产品的时候负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则,以及简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构等等。

到此这篇关于Java十分钟精通进阶简单工厂模式的文章就介绍到这了,更多相关Java 简单工厂模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java面向接口编程之简单工厂模式示例

    本文实例讲述了Java面向接口编程之简单工厂模式.分享给大家供大家参考,具体如下: 一 代码 interface Output { // 接口里定义的成员变量只能是常量 int MAX_CACHE_LINE = 50; // 接口里定义的普通方法只能是public的抽象方法 void out(); void getData( String msg ); } class Printer implements Output { private String[] printData = new Str

  • Java设计者模式简单工厂模式解析

    简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式. 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例. 简单工厂模式是一种对象创建型模式但是简单工厂模式不属于23种Gof设计模式之一. 实例 如何实现一个具有加减乘除基本功能的计算器? 对于这四种运算来说,都需要两个操作数,差别仅在于返回的结果不同. 由此,我们可以抽象化它们的共性,提炼出一个父类.这个类中包含两个操作数,一个返回结果方法,这个方法

  • 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简单工厂模式详细解释

    目录 简单工厂模式概述 简单工厂模式的结构与实现 结构: 实现 简单工厂模式的简化 简单工厂模式的优缺点和适用环境 简单工厂模式的优点 简单工厂模式的缺点 简单工厂模式的适用环境 简单案例 题目: UML: 运行结果: 总结 简单工厂模式概述 1.定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 2.在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method) 3

  • 深入理解Java设计模式之简单工厂模式

    目录 一.什么是简单工厂模式 二.简单工厂模式的结构 三.简单工厂模式的应用场景 四.简单工厂模式和工厂方法模式区别 五.简单工厂模式和策略模式的异同 六.简单工厂模式的优缺点 七.简单工厂模式的实现 八.总结 一.什么是简单工厂模式 简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例. 其实就是将一个具体类的实例化交给一个静态工厂方法来执

  • java设计模式学习之简单工厂模式

    简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 利用简单工厂模式设计一个计算器. 1:创建一个运算的类 package EasyFactoryModel; abstract class Operation { public double num1=0;

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

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

  • java简单工厂模式入门

    目录 前言 试例 1. 创建饮料接口(或者抽象类) 2. 具体饮料类的实现(可乐.雪碧) 3. 饮料生产工厂类 4. 工厂调用 总结 前言 定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method) 只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程 试例 以饮料加工厂为例 1. 创建饮料接口(或者

  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

    本文实例讲述了Java设计模式之工厂模式.分享给大家供大家参考,具体如下: 一. 简单工厂 先来思考一个问题.我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建一个B实例,然后调用B实例的方法.这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这种方式也被称为硬编码耦合),一旦系统需要重构:需要使用C类来代替B类时,程序就不得不修改A类代码,如果应用中有100个或者10000个类以硬编码方式耦合了B类,则需要修改100个.10000个地方

  • Java十分钟精通进阶简单工厂模式

    目录 1.什么是工厂模式? 工厂模式的定义: 2.简单工厂模式优点和缺点 3.简单工厂的代码实现 4.小结 1.什么是工厂模式? 工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离"的特点. 现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康.我们可以看到工厂的变化趋势,但是对于我们来说,看到是

  • Java十分钟精通进阶工厂方法模式

    目录 一.什么是工厂方法模式? 二.工厂方法模式的优缺点 三.模式的结构与实现 四.工厂方法模式代码实现 五.总结 一.什么是工厂方法模式? 工厂方法模式:也叫虚拟构造器模式或者多态工厂模式,它属于类创建型模式. 在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类. 我们知道在现在的真实工厂内分工越来越细,越来越专业化..各种产品有专门的工厂生产,

  • Java十分钟精通进阶适配器模式

    目录 1.什么是适配器模式? 2.适配器模式的定义 3.适配器模式的优缺点 4.适配器模式的结构与实现 5.适配器模式的代码实现 6.适配器模式的应用场景 1.什么是适配器模式? 其实适配器这三个字大家应该很熟悉,我们知道苹果公司的手机iPhone已经不提供充电插头了,包装盒内只有一根数据线,那么我们无法单独使用这根数据线进行在220V的插板上充电,因此我们需要重新购买一个适配器来把插板和手机连接起来,这就是适配器. 其实在软件设计中也可能出现,需要开发的具有某种业务功能的组件在现有的组件库中已

  • Java十分钟精通Log4j日志的使用

    目录 为什么要用日志? 下载: 详细步骤: 一.打开IDEA 二.创建日志对象 为什么要用日志? 我们知道,程序在运行过程中会产生很多很多信息,比如在几点几分的时候运行了,运行的结果是怎么样的?为了我们更加了解程序运行的情况,可以通过日志来查看,日志可以在控制台输出,也可以输出至指定的文件内,在下面的文章中具体的给大家介绍. 下载: Log4J是Apache公司的开源项目,用于日志处理.下载地址: https://logging.apache.org/log4j/2.x/download.htm

  • Java十分钟精通包装类的使用与操作

    包装类 何为包装类? 基本类型包装类的概述: 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据 包装类是将基本数据类型的值包装为Java中的对象,Java语言为8种基本数据类型分别提供了包装类 首先看一下八大数据类型的包装类: 包装类型出现的原因: 因为Java是一个面向对象的语言,基本类型并不具有对象的性质,为了与其他对象"接轨"就出现了包装类型,它相当于将基本类型"包装起来",使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本

  • Java十分钟精通String类的各种使用方法

    String String类: 代表字符串,提供了开发中常用的字符串处理的方法,如:求字符串的长度.截取字符串.替换字符串等方法,符串是常量,它的值创建之后就不可以再修改了. 首先我们先查一下官方文档,看看官方给String类定了什么方法: String也是属于java.lang包,所以不需要导入,这里就部分展示,全部的内容可以参考: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.htm

  • Java十分钟精通接口的使用与原理

    何为接口? 官方解释: Java内的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 个人理解解释: 其实接口可以理解为一种特殊的类,这个类里面全部是由全局常量和**公共的抽象方法(需要重写)所组成.接口是解决Java无法使用多继承的一种手段.我们可以把接口理解为是一个100%的抽象类,既接口中的方法必须全部是抽象方法.反正接口里面都是方法,但是没有方法体,其他类实现这个接口后重

  • Java十分钟精通泛型的使用与原理

    什么是泛型? 简而言之:<>泛型就是用来约束类.方法.属性上的数据类型,比如 List<Integer> list = new ArrayList<Integer>(); new ArrayList这个集合的元素只能添加Integer类型. 为什么需要泛型? Java推出泛型之前,程序员可以构建一个Object类型的集合,该集合能够存储任何的数据类型,而在使用该 集合的时候,需要程序员明确知道每个元素的具体的类型并向下转型,否则容易引发ClassCastExceptio

  • Java十分钟精通反射机制原理

    什么是反射? 反射机制是在运行状态中,它为Java提供一种"操作对象"的能力,在运行状态下,通过Class文件对象,可以调用到任何类里面的属性.方法.以及构造方法,包括私有的,所有的类在反射机制面前都是透明的 自己的概括:通过Class文件对象可以看到这个类里面的所有东西,并且可以使用和修改 反射的前提是获取Class文件对象((字节码对象),那么一共有三种方式获取: Class.forName("全类名") ----通过Class类的静态方法(最常用) 类名.cl

  • Java十分钟精通集合的使用与原理上篇

    目录 什么是集合? 集合分为Collection和Map两种体系 一.Collection接口: 二.Map接口下分为HashMap和TreeMap: 集合总结: Collections工具类: 什么是集合? 比如我们去买超市买很多东西,我们不可能拿一样就去收银台,我们可能是先放到购物车内,然后再统一处理,所以购物车相当于一个容器,可以装很多东西,在Java中的集合也是相当于一个容器,可以装很多数据. 集合继承关系图: 但是这张图太复杂了,我们看一张简便的: 集合分为Collection和Map

随机推荐