KittyDaddy's blog KittyDaddy's blog
首页
  • 学习笔记

    • 《Java基础》
    • 《常用设计模式》
    • 《MYSQL》
    • 《GO语言》
    • 《Spring源码解读》
  • 微服务解决方案

    • 锁的演化
    • 简单限流方案
    • 海量数据切分
  • 中间件

    • Nginx
    • MQ
    • Redis
    • Keepalived
  • 面试记
  • 杂文
  • 开源
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

老猫

万物皆系统
首页
  • 学习笔记

    • 《Java基础》
    • 《常用设计模式》
    • 《MYSQL》
    • 《GO语言》
    • 《Spring源码解读》
  • 微服务解决方案

    • 锁的演化
    • 简单限流方案
    • 海量数据切分
  • 中间件

    • Nginx
    • MQ
    • Redis
    • Keepalived
  • 面试记
  • 杂文
  • 开源
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • java常用设计模式-单例模式
  • java常用设计模式-工厂方法模式
  • java常用设计模式-简单工厂模式
    • 接手了个项目,被if..else搞懵逼了
    • 刚接手一个业务系统,我是这么熟悉的
    • 迈开拯救烂怂代码的第一步,我是这么做的
    • 忍不了,客户让我在一个接口里面兼容多种功能点
    • 但凡有点设计原则,系统也不会写成这样
    • 一个单例模式,没必要这么卷吧
    • 真香定律!我用这种模式重构了第三方登录
    • 不得不说,在很多业务中,这种模式用得真的很香
    • 《常用设计模式》笔记
    老猫
    2020-07-04
    目录

    java常用设计模式-简单工厂模式原创

    在现实生活中,其实我们可以看到很多的工厂,大大小小的,从最最简单的的造酒厂到大型的代加工的富士康,这个其实就是工厂的演变以及进化。于是乎在我们Java世界里,其实工厂模式也可以进化演变。老猫研究了一段时间,并且总结分享给大家。

    进化的流程大致是这样的:

    简单工厂模式->工厂方法模式->抽象工厂模式。接下来,跟着老猫一个一个往下看,在此期间,老猫会举一些例子,供大家参考。

    # 简单工厂模式

    在说明简单工厂模式之前,我们先举个例子,就拿造酒来说吧。一家酒厂可以酿造各种不同的酒,例如米酒,黄酒,白酒等。无论如何这个工厂也只能够具备造酒这一种职能。对照着这个例子,我们就能给简单工厂模式下个简单的定义。简单工厂模式是指由一个工厂对象决定创建某一种产品类型的实例。

    下面我们对照着实际的Java代码来进行举例。

    首先我们有一个酒厂这个接口,如下:

    //造酒厂接口
    public interface IDistillery {
        /**造酒**/
        void makeWine();
    }
    
    1
    2
    3
    4
    5

    再创建两个实现酒厂接口的黄酒以及白酒的实际制造铺,如下:

    /**白酒酿酒铺*/
    public class WhiteWineDistillery implements IDistillery{
        public void makeWine() {
            System.out.println("酿造白酒");
        }
    }
    
    1
    2
    3
    4
    5
    6
    /**黄酒酿造铺**/
    public class YelloWineDistillery implements IDistillery{
        public void makeWine() {
            System.out.println("酿造黄酒");
        }
    }
    
    1
    2
    3
    4
    5
    6

    以上我们就创建了两个酿造铺用来造酒,那么我们如何将这样的一个酿酒作坊运转起来呢?这时候我们要将这些造酒小铺组装到一起成为一个工厂。

    public class SimpleWineFactory {
        public IDistillery create(String name){
            if("white".equals(name)){
                return new WhiteWineDistillery();
            }else if("yellow".equals(name)){
                return new YelloWineDistillery();
            }
            return null;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    我们调用起来创建对象的时候就非常简单了,如下main函数:

    public class WineMain {
        public static void main(String[] args) {
            SimpleWineFactory swf = new SimpleWineFactory();
            //创建了黄酒厂
            swf.create("yellow");
        }
    }
    
    1
    2
    3
    4
    5
    6
    7

    以上就是一个最最乞丐版本的工厂模式。其中有哪个地方不足,我想,大家应该可以看出来。在以上的代码里面,其实这个工厂我们每次有一种新的酒出来的话,我们就要去修改这个工厂方法。参照软件的设计原则是不符合里面的开闭原则。其实我们完全可以通过之前介绍的反射技术对其进行优化。

    我们来看一下经过改造之后工厂方法:

    public class SimpleWineFactory {
        public IDistillery create(Class<? extends IDistillery> clazz){
            if(null != clazz){
                try {
                    return clazz.getDeclaredConstructor().newInstance();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    通过这样改造之后,我们可以进行这样的调用就会优雅很多,如下:

    public class WineMain {
        public static void main(String[] args) {
            SimpleWineFactory swf = new SimpleWineFactory();
            //创建白酒
            swf.create(WhiteWineDistillery.class).makeWine();
        }
    }
    
    1
    2
    3
    4
    5
    6
    7

    以上就是我们的简单工厂模式,该工厂模式其缺点是:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。在我们的实际JDK的源码中,其实也会有很多这样的应用,例如Calendar类,还有logback中的LoggerFactory,如果有兴趣的话,大家可以自行去看一下这些源码,我想肯定有所收获。

    #Java设计模式#简单工厂模式
    上次更新: 2022/11/30, 00:06:25
    java常用设计模式-工厂方法模式
    接手了个项目,被if..else搞懵逼了

    ← java常用设计模式-工厂方法模式 接手了个项目,被if..else搞懵逼了→

    最近更新
    01
    让大龄程序员欲罢不能的事儿
    09-23
    02
    运营明明设置了活动开始时间,为什么到点没生效?聊聊动态定时任务
    07-30
    03
    不是,大哥,咱这小门小户的,别搞我CDN流量啊
    07-25
    更多文章>
    Theme by Vdoing | Copyright © 2020-2024 Kitty Daddy | License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式