设计模式之工厂模式-程序员宅基地

技术标签: 设计模式  工厂模式  

什么是工厂模式?

我们在创建对象时不会对客户端直接暴露创建逻辑,而是 **通过使用一个共同的接口根据不同的条件来指向具体想要创建的对象。**简单来说,我需要某个类的对象,我只需要告诉工厂我需要这个类,工厂就给我返回这个类对象,而创建对象的具体实现由工厂来实现,调用者直接用结果就可以。

工厂模式的优点?

  • 使用工厂模式的优点在于一个调用者想创建一个对象,只要知道其名称(创建该对象的条件)就可以在工厂获取具体的对象

  • 扩展性强,如果想增加一个产品(也就是具体的对象),只要扩展工厂类就可以(也就是增加不同的标签,增加不同标签所对应的对象)。

  • 屏蔽产品的具体实现,调用者只关心能否获得想要的结果,无需关心内部实现

三种工厂模式详解


  • 简单工厂模式

    用工厂模式实现加减法运算器

    //运算器
    public class Operation {
          
       
        public String getName(){
          
            return "";
        }
    }
    
    
    //加法运算器
    public class Add extends Operation {
          
        @Override
        public String getName(){
          
            return "加法";
        }
    }
    
    
    //减法运算器
    public class Sub extends Operation{
          
        @Override
        public String getName(){
          
            return "减法";
        }
    }
    
    
    public class Factory {
          
    
        public static Operation createOperation(String operate){
          
    
    		//运算器
            Operation oper = null;
    
            switch(operate){
          
                case "+":
                    oper = new Add();
                    break;
                case "-":
                    oper = new Sub();
                    break;
            }
            return oper;
        }
    }
    
    //测试
    public class Test {
          
        public static void main(String[] args) {
          
            //创建运算器
            Operation operation;
            //通过入参条件告诉工厂我应该创建的是减法运算器
            operation = Factory.createOperation("-");
            System.out.println(operation.getName());
        }
    }
    
    
    特点
    • 只有一个工厂factory

    • factory类是一个具体的类,非接口/抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。

  • create()方法通常是静态的,所以也称之为静态工厂。

缺点
  • 扩展性差(我想增加乘法,除了新增一个乘法类,还需要修改工厂类方法,在switch添加乘法条件)

    • 不同的类需要不同额外参数的时候 不支持。

  • 工厂方法模式

    还是上面那个例子,如果我需要添加乘法和除法功能,势必要添加新的运算类,并且还有修改factory类的create方法。这样是违法开闭原则的。

    我们先定义加减运算为简单运算,乘除运算为复杂运算。

    //定义抽象工厂,所有工厂必须实现该接口
    public interface Factory {
          
        public Operation createOperation(String operate);
    }
    
    
    //复杂运算工厂
    public class ComplexFactory implements Factory {
          
    
        public Operation createOperation(String operate){
          
            Operation oper = null;
            switch(operate){
          
                case "*":
                    oper = new Mul();
                    break;
                case "/":
                    oper = new Div();
                    break;
            }
            return oper;
        }
    }
    
    //简单运算工厂
    public class EasyFactory implements Factory {
          
        public  Operation createOperation(String operate){
          
            Operation oper = null;
            switch(operate){
          
                case "+":
                    oper = new Add();
                    break;
                case "-":
                    oper = new Sub();
                    break;
            }
            return oper;
        }
    }
    
    //定义抽象运算器,所有运算器必须实现该接口
    public interface Operation {
          
        public String getName();
    }
    
    //复杂运算器
    public class ComplexOperation implements Operation {
          
    
        public String getName(){
          
            return "";
        }
    }
    
    //简单运算器
    public class EasyOperation implements Operation {
          
        @Override
        public String getName() {
          
            return "";
        }
    }
    
    //加法运算器
    public class Add extends EasyOperation {
          
        @Override
        public String getName() {
          
            return "加法";
        }
    }
    
    //减法运算器
    public class Sub extends EasyOperation{
          
        @Override
        public String getName() {
          
            return "减法";
        }
    }
    
    //乘法运算器
    public class Mul extends ComplexOperation {
          
    
        @Override
        public String getName() {
          
            return "乘法";
        }
    }
    
    //除法运算器
    public class Div extends ComplexOperation {
          
        @Override
        public String getName() {
          
            return "除法";
        }
    }
    
    
    //测试
    public class Test {
          
        public static void main(String[] args) {
          
    
            //运算器
            Operation operation = null;
    
            //复杂运算工厂
            Factory complexfactory = new ComplexFactory();
    		//简单运算工厂
            Factory easyfactory = new EasyFactory();
    		//通过不同工厂可创建不同的对象实例
            operation = complexfactory.createOperation("*");
            System.out.println(operation.getName());
            
            operation = easyfactory.createOperation("+");
            System.out.println(operation.getName());
    
        }
    }
    
    特点
    • 有多个工厂factory(实现同一工厂接口),有多种产品operation(实现同一产品接口),产品与工厂相对应
    • 扩展性强,添加新的产品需要添加对应的工厂,无需改动原来代码,直接实现产品接口和工厂接口即可

  • 抽象工厂模式

    在工厂方法模式中,产品种类是单一的,比如上面的例子,运算只是基本的四则运算,如果涉及到对象与对象之间的运算呢?这就不是简单的四则运算了,抽象方法模式就针对多种产品。
    在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45638407/article/details/100864018

智能推荐

【C++学习】map和set-程序员宅基地

文章浏览阅读963次,点赞26次,收藏10次。【C++学习】map和set

SaaS到底是什么,如何做?这份笔记讲明白了_saas如何开发-程序员宅基地

文章浏览阅读1.3k次。阅读本篇文章,您将可以了解:1、什么是SaaS;2、SaaS的商业模式;3、SaaS的技术架构;4、国内比较好的SaaS平台。_saas如何开发

摄像头接入_大华sdk frealdatacallback码流输出链接-程序员宅基地

文章浏览阅读1.5k次。摄像头接入目前摄像头直播的方案主要有以下几种方式: rtsp方式接入,只能实现视频预览 国标协议接入,实现比较复杂,需要多实现SIP服务器 通过netsdk获取到视频码流,推流到流媒体服务器,通过wsflv,flv,hls等流媒体协议播放,H265不支持 一、采用方案对比后最终采用了第三种方式,java使用jna的方式接入大华netsdk,获取到dav视频码流后去除大华头尾,拿到H264裸码流,通过javacv(对ffmpeg、opencv等库的封装)推送到.._大华sdk frealdatacallback码流输出链接

git-commit-amend踩坑_git remote-tracking 本地commit amend不了-程序员宅基地

文章浏览阅读1.4k次。因为改动比较小,所以我不想重建一个commit,于是我是用了git commit --amend命令,由于之前已经将该commit推送到远程仓库,导致修改后推送失败。百度后发现如果你的commit已经push到了远程仓库,那么使用--amend修改commit后,git push时一定要使用 --force-with-lease 参数来强制推送,否则就会报错。这是我自己推送失败的例子解决方式一、第一种使用后git commit --amend -m "修改Git学习(三)指令"注意:-m “._git remote-tracking 本地commit amend不了

AI实验1——八数码问题_人工智能实验八数码难题-程序员宅基地

文章浏览阅读2.5k次,点赞6次,收藏15次。AI实验1——八数码问题一、实验目的与要求实验目的:1 . 熟悉状态空间表示法;2.掌握深度优先、广度优先和等代价无信息搜索算法;3.掌握启发式函数设计,实现面向实际问题的A*搜索算法;二、实验内容与方法实验内容:利用无信息搜索算法实现八数码难题求解;设计启发式信息函数,利用A*搜索实现八数码难题求解;三、实验步骤与过程1,问题分析在八数码难题中,我们使用状态空间表示法,将八数码矩阵(即矩阵的状态)设置为一个节点类(Node),各个节点之间通过操作集(Operater)[‘U_人工智能实验八数码难题

【Js canvas实现是否透明,抠图等功能原理】_js-demo抠图-程序员宅基地

文章浏览阅读2.8k次,点赞4次,收藏11次。透明背景转jpg格式后变黑我们先看demo,您可以狠狠地点击这里:png图片是否含有透明像素JS检测demo如果是不含透明色的PNG图片,则会提示不含透明;如果是,则提示含透明,如下截图:是否背景透明的检测检测原理是借助canvas的getImageData()方法,关于此方法具体API和使用,可以参见““像素点信息获取”这里的详细介绍。_js-demo抠图

随便推点

用JAVA实现记事本_记事本 cambria math 分数-程序员宅基地

文章浏览阅读275次。用Java语言实现Windows版本的记事本程序(实现了部分功能模块的记事本),代码复制粘贴如下:import java.awt.;import java.io.;import java.awt.event.;import javax.swing.;import java.net.;import javax.swing.border.;import java.util.Date;import java.text.SimpleDateFormat;import java.lang.*;_记事本 cambria math 分数

Linux SSH密码暴力破解技术及攻防实战_password top 1000-程序员宅基地

文章浏览阅读6k次,点赞8次,收藏55次。对于Linux操作系统来说,一般通过VNC、Teamviewer和SSH等工具来进行远程管理,SSH是 Secure Shell的缩写,由IETF的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和加粗样式其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。SSH客户端适..._password top 1000

html静态页面微信分享带缩略图,【荐】静态页面实现微信分享带缩略图、标题和描述...-程序员宅基地

文章浏览阅读1.2k次。这篇文章主要为大家详细介绍了【荐】静态页面实现微信分享带缩略图、标题和描述,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。静态页面实现微信分享带缩略图、标题和描述,想法很现实,要想实现这样的功能这里就要用到大ajax技术,在这里361源码分享给大家。服务端文件jssdk.php代码:..._html分享链接加图片和描述不需要调用jssdk

VASP学习1入门知识_vaspwiki-程序员宅基地

文章浏览阅读5.9k次,点赞10次,收藏63次。大师兄科研实例使用方法:1从最基本的计算开始,通过示例讲解,结合一些脚本的使用,引导大家思考解决自己的问题。因此,在这本书的学习过程里,每一章节会对应一个例子,大家务必手动搭建模型,输入文件(切忌复制粘贴),然后进行计算,得到和大师兄一致的结果。为了引导大家主动浏览官网解决问题,很多都会采用VASP官网的例子。2如何学习本书,大师兄在学习程序时,受learn_python_the_hard_w..._vaspwiki

想说好多话_好多好多话-程序员宅基地

文章浏览阅读222次。以前觉得深圳好热,可是现在觉得沈阳的风好冷…每天不需要说太多的话,只要敲着喜欢的键盘,默默的清理掉禅道上的bug就好,这样的工作似乎是充实的,却总是少点什么,我也喜欢上了活在自己的小世界里,喜欢上了听歌,喜欢去刷微博,喜欢上去看那些心灵鸡汤和搞笑的博主,喜欢看看最近的陈伟霆是不是有帅了,偶尔碰到一条好玩的微博似乎会笑上一会儿,可能作为一个程序猿,真的比较枯燥叭,有时觉得孤单的像一条_好多好多话

简述计算机维修 维护的基本原则是什么,计算机硬件维护的四大原则-程序员宅基地

文章浏览阅读2.4k次。计算机硬件维护的四大原则近年来,随着社会经济的快速发展和计算机网络技术的广泛应用,如今计算机已经成为生产生活中不可或缺的必需品,随之而来就出现一些问题。下面是YJBYS小编为大家搜索整理的关于计算机硬件维护的四大原则,欢迎参考阅读,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生培训网!对于计算机而言,主要包括硬件系统与软件系统两部分,其中硬件系统是软件系统功能得以实现的重要基础和前..._硬件维修的基本原则?

推荐文章

热门文章

相关标签