人人都会设计模式:01-简单工厂模式--SimpleFactory

版权声明:本文为博主原创文章,未经博主允许不得转载

PS:转载请注明出处
作者: TigerChain
地址: http://www.jianshu.com/p/36fe35ad743a
本文出自 TigerChain 简书 人人都会设计模式

教程简介

  • 1、阅读对象
    本篇教程适合新手阅读,老手直接略过
  • 2、教程难度
    初级
  • 3、Demo 地址
    稍后 提供

正文

一、什么是简单工厂

1、 生活中的工厂

简单工厂,从字面意思也能理解出来,就是一个很简单的工厂「W T F」,说了等于没有说是吧。我们先说说工厂吧

工厂就是一个制造厂,在生活中工厂太多太多了,比如车厂就是用来造车的,双汇就是出火腿肠的「当然不只是火腿」,烟草厂就是制作和加工香烟的,等等。

生活中的这些工厂是如何工作的呢?比如双汇制作火腿肠,肯定是把肉送进去,根据若干程序最后出来就是火腿。「如果想要鸡肉肠,那么加点鸡肉,玉米的加点玉米」,也就是说给定一些原材料「玉米、肉」出来的就是玉米肠,也就是说工厂就是输入东西----然后制造出我想要的东西「至于你怎么样制造的,我管你呢」

2、 程序中的工厂

程序是源于生活的,所以程序中的工厂和生活中的工厂非常类似,生活工厂中的产品非常多,但是在程序中工厂的作用就是创造对象。

简单工厂模式定义

简单工厂模式又称为静态工厂模式,简单工厂模式的作用就是创建一个工厂类用来创建其它类的实例,至于类是怎么样创建的对用户来说是不可见的「屏蔽细节」

简单工厂模式结构

角色 类别 说明
Product 产品类 一般是一个抽象类或是接口
ConcreteProduct 具体的产品类 实现或是继承 Product
Factory 工厂类 用来创建具体的产品

简单工厂模式的 UML 图

二、简单工厂举例

比如我有苹果、桔子、等水果,然后有一个榨汁机,我给一个苹果就给我榨出苹果汁,给桔子就出桔汁。

分析一下:

在这个例子中,果汁就是我们的产品,而苹果汁,桔子汁就是我们的具体的产品,榨汁机就是我们的工厂,而苹果,桔子等水果就是我们输送的原材料

写代码

写代码之前先看看榨汁机工厂的 UML 图

  • 1、定义抽象产品果汁接口 IJuice.java
/**
 * @Description 创建一个果汁接口
 * @Creator TigerChain(创建者)
 */
public interface IJuice {
    String getName() ;
    //也可以声明一些其它的业务方法
}

  • 2、定义具体的产品,苹果汁「AppleJuice.java」,桔汁「OrangeJuice.java
# AppleJuice.java

/**
 * @Description 一个具体的产品--- 苹果汁
 * @Creator TigerChain(创建者)
 */
public class AppleJuice implements IJuice {

    public static final String TAG = "AppleJuice" ;

    @Override
    public String getName() {
        Log.e(TAG,"我是苹果汁") ;
        return "我是苹果汁";
    }
}
# OrangeJuice.java

/**
 * @Description 具体的产品桔子汁
 * @Creator TigerChain(创建者)
 */
public class OrangeJuice implements IJuice {

    public static final String TAG = "OrangeJuice" ;

    @Override
    public String getName() {
        Log.e(TAG,"我是桔子汁") ;
        return "我是桔子汁";
    }
}
  • 3、创建榨汁机「工厂类」 JuiceFactory.java
/**
 * @Description  果汁机---工厂
 * @Creator junjun(创建者)
 */
public class JuiceFactory {

    /**
     * 根据名称来生产不同的果汁
     * @param name
     * @return
     */
    public static IJuice createJuice(String name){
        IJuice iJuice = null;
        if(name.equals("apple")){
            //苹果汁
            iJuice = new AppleJuice() ;
        }else if(name.equals("orange")){
            //桔子汁
            iJuice = new OrangeJuice() ;
        }

        return iJuice ;
    }
}
  • 4、在 MainActivity 中使用

核心代码,其它的代码是布局有两个按钮和一个文本,并且添加点击事件,这里不贴代码了。

 @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_create_apple:
                //对使用者来说,屏蔽了具体的细节,我管你杂榨汁呢
                IJuice appleJuice = JuiceFactory.createJuice("apple") ;
                tv_show_result.setText(appleJuice.getName());
                break ;
            case R.id.btn_create_orange:
                IJuice orangeJuice = JuiceFactory.createJuice("orange") ;
                tv_show_result.setText(orangeJuice.getName());

                break ;
            default:
                break ;
        }

    }
}
  • 5、运行结果看果

这样我们一个简单的工厂模式就完了,是不是很简单「所以才叫简单工厂模式吗 (^__^)」

三、从 Android 中看简单工厂

BitmapFactory

在 Android 中我们经常使用 Bitmap ,其实和 Bitmap 相关的 BitmapFactory 就是一个简单工厂模式

我们来看看 BitmapFactory 的方法

可以看到 BitmapFactory 分为两类,一类是普通原静态方法「红色框中」,第二类是 JNI 调用的方法「黄色框内」

其实从字面意思我们也可以看到 BitmapFactory 就是 Bitmap 的工厂就是用来生成 Bitmap 的

概括起来 BitmapFactory 生成 Bitmap 无非就是根据三种输入源「各个参数」

  • 1、图片的路径
  • 2、图片的二进制文件
  • 3、图片的流

好我们现在就拿简单工厂模式来分析 BitmapFactory ,为什么说 BitmapFactory 是一个简单工厂模式

BitmapFactory UML 分析

通过前面的学习,我们知道简单工厂模式要有一个产品「抽象类」,具体产品「实现类」,还要有一个工厂,我们拿这三样对比 BitmapFactory 就可以了 ,我们看到是这样的

纳尼?这是简单工厂模式吗?怎么和简单工厂模式的结构匹配不上呢,话说我的产品接口呢?

这肯定是简单工厂模式,没看比我们前面的简单工厂模式结构还简单吗?^__^,还有谁 TM 说一定必须得有抽象产品这么一说「反正我没有说」,为什么呢?因为 BitmapFactory 很明确就是创建 bitmap 的「功能很单一」,这里的 bitmap 就是我的具体产品「只有这一个产品呀,你咬我呀」,我还需要抽象产品接口吗?肯定不需要了。

BitmapFactory 生成 Bitmap 流程

大概看一个 BitmapFactory 生成 Bitmap 的一个流程吧,这里以 decodeFile(String filePath) 为例来说明

上图已经很清楚的看到使用 BitmapFactory.decodeFile(String filePath) 生成一张 Bitmap 的过程了「最后是调用 JNI 来生成 Bitmap 的」,其它的方法过程都是类似,其实这一张图就是生成一张 Bitmap 的细节,而使用 BitmapFactory 就是把这些细节都屏蔽了,我管你杂生成的,我给你一个图片路径你给我生成一个 Bitmap 就好了

2、Executors 「它不是 Android 固有,Java 中就有」

我们对 Executors 应该不会陌生「这里不过多讲 Executors,只是感受一下简单工厂模式」,Executors 是用来创建线程池的,其它它也是一个工厂,我们来看看吧

我们来看看 Executors 的方法

在这里,我只截取了部分方法,我们可以看到 Executors 有一些创建缓存线程池等等一系列方法,并且其中还有一个线程工厂「图中红色框,从名字可以看出」

Executors 简单的 UML

上图是 Executors 简单的一个 UML 没有全部画出,大概意思基本上表明了,我们从图中可以看出,Executors 完全就是一个简单工厂模式,基本上符合我们简单工厂模式的结构,只不过多了几个接口和类而已「我们只看(1),(2),(3) 就完全符合简单工厂模式」,也就是我给你一些参数你给我创建我想要的线程池即可

四、简单工厂的优缺点

优点:

  • 实现起来非常简单「不然叫毛个简单工厂呢」,也充分利用了多态机制
  • 解耦「使调用端不再创建对象,而是交给工厂去创建」,并且对内部实现屏蔽「调用端不知道具体实现」
  • 分工明确,并且能更好的体现出代码含义

缺点:

  • 工厂静态方法无法继承
  • 代码维护不容易,如果想要创建更多的具体实现的对象,需要大量修改工厂
  • 违反开闭原则「对扩展开放,对修改关闭」,如果有一个新的对象要添加,那么就要修改工厂

以上就是对简单工厂模式的一个介绍,确实挺简单的,一定要动手练练

公众号:TigerChain

时间: 2024-10-20 07:17:35

人人都会设计模式:01-简单工厂模式--SimpleFactory的相关文章

设计模式: 简单工厂模式

引入: 在我们的思维中,会有一种习惯,当遇到某种问题时,会直接考虑用最直接的语言去去实现它,而往往忽略了整个程序的可维护性.可扩展性. 比如,我们写一个基本的计算器功能,要求能计算四则运算,大家或许会直接写: public class ProgramDemo{ public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(

C#设计模式(2)——简单工厂模式

原文:C#设计模式(2)--简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂模式的介绍 说到简单工厂,自然的第一个疑问当然就是什么是简单工厂模式了? 在现实生活中工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类, 我们平常编程中,当使用"new"关键字创建一个对象时,此时该类就依赖与

php设计模式之简单工厂模式详解_php技巧

本文以实例形式较为详细的介绍了PHP设计模式的简单工厂模式,对于进行PHP程序设计来说有很好的借鉴作用.具体如下: 一.概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(A

java设计模式之简单工厂模式

在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装):如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetResult()虚函数,这时添加新的运算只需要派生一个新的类,即不需要之前的运算参与编译.如何让计算器知道我是希望使用哪种运算呢?应该考虑单独的类来做这个创造实例的过程,这就是工厂.创建一个OperationFactory类,传入参数,函数createOperate就可以实例化出合适的对象. Java代码

解读设计模式----简单工厂模式(SimpleFactory Pattern)

一.模式概述 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现,学习了此模式可以为后面的很多中模式打下基础.那好,我们就来了解下什么是简单工厂模式? 我们来分析一个现实生活中的案例,每天早晨起床洗唰后是干什么呢?吃早餐(这里只针对在外吃早餐的上班族

设计模式-简单工厂模式(SimpleFactory-C#)

设计 <java与模式> 上面那本书上的例子举的是园丁和果园的例子,学习设计模式最好在生活中自己找个例子 实践一下,下面是我自己的一个例子,是讲快餐店的例子,快餐店提供很多食物,比如 面条,米饭,面包.首先定义了一个Food接口,然后这些食物都从它来继承,定义了一个大厨 他包办所有食物的制作工作,这就是我所理解的简单工厂模式的概念,下面是源代码: using System; namespace SimpleFactoryPattern{ /// <summary> /// 简单工厂

设计模式之简单工厂模式

设计模式,六大设计原则,类的特性 总纲 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 简单工厂模式(Simple Factory) 简单工厂模式就是工厂方法模式的缩小版 通用类图 组成 1.工厂类:这是本模式的核心,含有一定的商业逻辑和判断逻辑.在java中它往往由一个具体类实现. 2.抽象产品:它一般是具体产品继承的父类或者实现的接口.在java中由接口或者抽象类来实现. 3.具体产品:工厂类所创建的对象就是此角色

大话设计模式之简单工厂模式

       从设计模式的类型来说,简单工厂模式是属于创建性模式,又叫做静态工厂方法模式,但不属于23中GOF设计模式之一,简单的工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.         那么到底什么是简单工厂模式?我们中午在中快食堂吃饭,中快食堂满足了我们的需求,这里的中快食堂就是一个简单的工厂,在现实生活中工厂是负责生产产品的,,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个

C++设计模式之简单工厂模式实例_C 语言

问题描述 之前在公司做了一个windows 8平台的阅读器.首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形.图像和文字等等:不同的内容,就是不同的对象:在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘.这个时候,就需要进行很多new操作,new操作分布在代码的不同地方,管理起来很麻烦,而且也很乱,到后期扩展和维护的时候,有的时候,对象多的让开发人员不知道这个对象是干什么的,这就增加了难度:同时,new操作,都会有对应

人人都会设计模式:05-代理模式--Proxy

版权声明:本文为博主原创文章,未经博主允许不得转载公众号:TigerChain 更多文章等着你 作者: TigerChain 教程简介 1.阅读对象 本篇教程适合新手阅读,老手直接略过 2.教程难度 初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 正文 一.什么是代理模式 1.生活中的代理 1.微商代理 代理在生活中就太多了,比如微商,在朋友圈中很多时候都可以看到微商说城招全国代理「不需要货源,不需要启动资金,只需要一个电话就能做生意,好吧我口才不好,没有人家吹的好」,这类