精华内容
下载资源
问答
  • a) 单例模式:单例模式核心只需要new一个实例对象的模式, 比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的, 把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加...

    a) 单例模式:单例模式核心只需要new一个实例对象的模式,

        比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,

        把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加一再放回去,

        有人退出登陆的时候取出来减一再放回去,

        但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,

        所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,

        并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。

    b) 策略模式:就是将几个类中公共的方法提取到一个新的类中,

        从而使扩展更容易,保证代码的可移植性,可维护性强。

        比如有个需求是写鸭子对象,鸭子有叫,飞,外形这三种方法,

        如果每个鸭子类都写这三个方法会出现代码的冗余,

        这时候我们可以把鸭子中的叫,飞,外形这三个方法提取出来,放到鸭父类中,

        让每个鸭子都继承这个鸭父类,重写这三个方法,这样封装的代码可移植性强,

        当用户提出新的需求比如鸭子会游泳,那么对于我们oo程序员来讲就非常简单了我们只需要在鸭父类中加一个游泳的方法,

        让会游泳的鸭子重写游泳方法就可以了。

    c) 工厂模式:简单的工厂模式主要是统一提供实例对象的引用,通过工厂模式接口获取实例对象的引用。

        比如一个登陆功能,后端有三个类,controller类,interface类,实现接口的实现类。

        当客户端发出一个请求,当请求传到controller类中时,controller获取接口的引用对象,

        而实现接口的实现类中封装好了登陆的业务逻辑代码。当你需要加一个注册需求的时候只需要在接口类中加一个注册方法,

        实现类中实现方法,controller获取接口的引用对象即可,不需要改动原来的代码,这种做法是的可拓展性强。

    展开全文
  • java工厂模式

    2020-08-03 20:00:34
    也是一种设计模式。和之前的单例模式。是一种模式 设计模式是项目架构思想。 匿名对象

    也是一种设计模式。和之前的单例模式。是一种模式

    设计模式是项目架构思想。 

     

    匿名对象 

     

     

     

    展开全文
  • java设计模式思想

    千次阅读 2015-07-03 12:02:25
    命令模式: 首先要有命令类就是具体的操作方法,比如攻击某个部队。 然后要有具体的命令接口 Command ,该接口有执行方法execute(). 然后有接受者,该接受者实现命令接口,同时还有命令类的引用。 最后就是请求者...

    命令模式:

    首先要有命令类就是具体的操作方法,比如攻击某个部队。 然后要有具体的命令接口 Command ,该接口有执行方法execute().
    然后有接受者,该接受者实现命令接口,同时还有命令类的引用。 最后就是请求者,该请求者包含命令接口的引用 command引用。

    观察者模式:

    首先要有主题,给主题是个接口包含很多方法,然后就是观察者接口同样定义了一些方法。然后就是实现主题的类,实现观察者接口的类同时该类含有对主题的引用。 实现不同的观察者接口的类就可以定义自己的业务。

    装饰模式:

    首先定义一个抽象的方法(抽象组件),然后就是定义该类的实现类(具体组件) 然后就是装饰类该类继承具体组件类,同时还有对抽象组件的引用。然后就是具体的装饰 该类继承装饰类(具体装饰类) 。

    适配器模式:

    首先就是要有一个目标接口(target) 然后再定义一个接口(被适配者) 然后就是定义一个适配器继承目标类同时还有对被适配者的引用。

    外观模式:

    首先定义一个子系统 ,子系统包含各种业务类。比如打印 结算呀,,,然后就是定义一个外观类该类有对子系统的引用。

    中介者模式:

    首先定义一个接口(colleage)该类定义了很多方法 ,然后就是定义了很多接口的实现(colleageA colleageB...)等。最后就是具体的中介者类 就是包含对该类(colleageA...)的引用的引用


    工厂方法模式:

    首先定义一个抽象产品(product)然后再定义多个具体产品(concreateProduct)继承抽象产品。然后定义构造器(creator) 该抽象类定义几个抽象方法。
    然后定义多个具体构造者(concreateProduct) 在多个抽象类中实现的方法中定义一个或多个具体的产品(new的方式)






    展开全文
  • java策略模式实战示例

    万次阅读 多人点赞 2019-05-25 00:32:21
    以一个顾客价格计算策略为背景,写一个策略模式的demo 参考代码 :https://github.com/zhang-xiaoxiang/DesignPatterns23 没有用策略模式我们一般是下面的写法,直接写一个类,在类里面直接写策略算法(功能实现) //...

    现已放在gitee上,可以不下载直接参考一下即: https://gitee.com/zhang-xiao-xiang/zxx-pattern

    日常碰到的业务概述

    • 登录类型,支付类型,供应商渠道,不同等级会员享受的优惠券价格不一样,等等业务判断,大量if else导致拓展(侧重新增)极其困难,维护(侧重修改)自然是改起来头痛(其实一个类型的增加[拓展一个类型]往往对应这个类型的增删改查CRUD[维护]),比如业务一开始一个简单的登录,往往做一个电话号码和验证码登录的方式或者账号密码登录方式,后来随着业务的增加或者提高用户体验,那么需要拓展(新增一种)三方登录,比如新增微信登录,支付宝登录,甚至抖音登录,一大堆,你要根据登录方式来处理,那就有点恼火吧,支付方式也是同样的问题,我们可以发现一个规律,凡是可以枚举的业务,往往都需要使用设计模式才能更好的解决,比如策略模式(往往搭配工厂模式使用更配哦),水来土掩,兵来将挡,这思想和高中数学中的分类讨论思想一模一样.遇事不要慌,因为还有dang中央.所以,我们就打个栗子,举个比方,更加形象一点

     由于太多的策略模式时根据顾客VIP等级不同,得到的商品价格不一样的例子,这里还是换个汤,顺便更新了一下博客,以星座自我介绍(根据星座的类型不同,返回不同的信息)为例子,结合springboot实际感受一下在实战时的策略模式样子

    先来个直观的对比一睹为快(放大效果更佳)

    未使用时:我们经常直接在业务层开始了if else的常规操作

     

     使用策略模后时:注意看一下描述

    简单做个结论:这里不是说代码量减少了哈,而是说需要新增或者修改的时候,维护难度就不一样了

    策略模式

    经过对比分析,发现之所以出现if else和分支,还是少了面向接口编程的思想,做一件事情,假如实现方式多样,那么第一个想到的就是抽象出事情,不管是抽象类也好,做成接口也罢,反正尽量朝着多态的方向去就对了.if else做的事情就是在处理对应星座的描述信息,所以把要描述信息抽取成一个策略方法

    1:面向接口编程,这里抽取业务方法(这里有个2个方法是为了对比哈,第二个就是策略模式抽取的)

    package com.zhang.zxx.pattern.strategy.service;
    
    /**
     * BusinessService:业务服务层
     *
     * @author zhangxiaoxiang
     * @date 2021/07/18
     */
    public interface BusinessService {
        /**
         * 根据星座类型获取星座详情
         * @param type 星座类型 枚举
         * @return 星座描述
         */
        Object getInfo(Integer type);
        /**
         * 根据星座类型获取星座详情
         * @param type 星座类型 枚举
         * @return 星座描述
         */
        Object getInfoWithStrategy(Integer type);
    }

    再来一个接口 ,这里是处理策略的方法,不是业务的层面的方法

    package com.zhang.zxx.pattern.strategy;
    
    import java.util.Map;
    
    /**
     * StrategyService:定义策略接口,,这里可以理解为if(满足条件fetchKey){执行execute的策略 }
     * 联系后面的类可以感觉这里相当于抽象了个map出来
     *
     * @author zhangxiaoxiang
     * @date 17/7/2021
     */
    public interface StrategyService {
        /**
         * 匹配策略的key[这个key使用枚举管理最为合理]
         *
         * @return key
         */
        Integer fetchKey();
    
        /**
         * 匹配后具体策略执行
         *
         * @return 结果[这里为了对数据执行策略结果的收集,选择了Map<String, Object>较为通用,当然void或者object也行,根据实际项目来即可]
         */
        Map<String, Object> execute();
    }

    2:编写策略接口的实现类,这里举一个实现类就行了,我尽量做到减少篇幅

    package com.zhang.zxx.pattern.strategy.strategy;
    
    import com.zhang.zxx.pattern.strategy.MyEnum;
    import com.zhang.zxx.pattern.strategy.StrategyService;
    import org.springframework.stereotype.Service;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * FirstStrategyImpl:水瓶座策略类[这里具体策略execute比如为知我介绍]
     *
     * @author zhangxiaoxiang
     * @date 2021/07/18
     */
    @Service
    public class AquariusStrategyImpl implements StrategyService {
        /**
         * 匹配策略的key[这个key使用枚举管理最为合理]
         *
         * @return key
         */
        @Override
        public Integer fetchKey() {
            //水瓶座策略标识
            return MyEnum.AQUARIUS.getNum();
        }
    
        /**
         * 匹配后具体策略执行
         *
         * @return 结果[这里为了对数据执行策略结果的收集, 选择了Map<String, Object>较为通用,当然void或者object也行,根据实际项目来即可]
         */
        @Override
        public Map<String, Object> execute() {
            Map<String, Object> map=new HashMap<>(16);
            map.put("name","我是水瓶座");
            map.put("birthTime","1月20日~2月18日");
            map.put("luckyNumber","3、5、7");
            return map;
        }
    }
    

    3:即便有了策略接口和对应的实现类,但是仍然不能使用,此时需要一个策略辅助或者叫做处理类来帮忙,像一个工厂一样的类,其实就是工程模式的实现哈

    package com.zhang.zxx.pattern.strategy;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    /**
     * StrategyHandler:策略处理类[可以理解为策略工厂类]
     *
     * @author zhangxiaoxiang
     * @date 18/7/2021
     */
    @Component
    @Slf4j
    public class StrategyHandler implements InitializingBean, ApplicationContextAware {
        /**
         * 存放策略的map,可以理解为策略的注册中心
         */
        private final Map<Integer, StrategyService> strategyServiceMap = new ConcurrentHashMap<>(16);
        /**
         * spring的上下文
         */
        private ApplicationContext applicationContext;
    
        /**
         * 将StrategyService的类都按照定义好的规则(fetchKey),放入strategyServiceMap中
         */
        @Override
        public void afterPropertiesSet() {
            //初识化把所有的策略bean放进ioc,用于使用的时候获取
            Map<String, StrategyService> matchBeans = applicationContext.getBeansOfType(StrategyService.class);
            //策略注入的bean做key,策略实现类做value
            matchBeans.forEach((key, value) ->{
                strategyServiceMap.put(value.fetchKey(), value);
                log.info("初始化策略模式的键值对 key={},value={}",key,value);
            });
        }
    
        /**
         * 注入applicationContext
         *
         * @param applicationContext ac
         * @throws BeansException e
         */
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        /**
         * 通过key获取对应的策略实现
         *
         * @param key key(String类型或者整形都行,保持和策略接口一致就行)
         * @return strategyService
         */
        public StrategyService getStrategy(Integer key) {
            if (null==strategyServiceMap.get(key)) {
                //默认策略
                return strategyServiceMap.get(0);
            }
            return strategyServiceMap.get(key);
        }
    }

    其实到这里已经完了,结构大致如图

    如果觉得文章有点乱还是建议看完整代码吧,确实要全部展现出来篇幅太大哈

    小结和抛出一些观点:有个缺点就是类膨胀,就是策略类太多的情况下,这个类就太多了,当然有方式处理,但是结合实际,最终还是妥协选择类膨胀,因为这个也不算什么大缺点,可以忽略.其实java的JDK8的函数式编程和Lambda表达式(简化匿名类等写法)可以让策略模式更加优雅,其实就是相当于JDK8新特性是把23中设计模式更加抽象的方式用在新语法上了,符合时代潮流,拓展java的函数式编程领域,可以大概参考哈新特性  https://zhangxiaoxiang.blog.csdn.net/article/details/100638661

    展开全文
  • JAVA 21设计模式 工厂模式,桥梁模式等 学习java高级设计思想的好书
  • 工厂模式工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式根据抽象程度的不同又可以细分为: 简单工厂模式 工厂方法...
  • 最近在学习设计模式,结合了一下其它博客的观点,按照了自己的理解与实现,将自己的想法表达出来,以比较简单的易懂的方式写出来,作为自己学习的输出,内容不是十分全面,希望帮助你们通过这里快速了解大概的思想,...
  • Java设计模式》的目的是让读者不仅学习怎样在软件设计中使用好设计模式,更重要的是让读者通过学习使用设计模式深刻地理解面向对象的设计思想,以便更好地使用面向对象语言解决设计中的诸多问题。
  • java 工程模式

    2010-06-20 21:15:00
    论坛首页 → Java编程和Java企业应用版 → 设计模式工厂方法模式-4.全部 Hibernate Spring Struts iBATIS 企业应用 设计模式 DAO 领域模型 OO Tomcat SOA JBoss Swing Java综合 myApps快速开发平台,配置即开发...
  • 创建型模式,共五种:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略...
  • java设计模式之简单工厂模式

    千次阅读 2016-04-20 20:18:05
    软件开发中学好设计模式可以让你不用重复去造轮子。那么什么是设计模式呢? 设计模式:是一种解决特定环境下、...好的,那就废话不多说,直接进入本文的主题:简单工厂模式。面向接口编程大家都知道,软件开发都需要进
  • 总的思想就是希望说通过实现工厂模式可以为后期的功能扩展,或者类似模块的追加,提供一些便利,可以在不用动到核心代码的情况下,完成客户的需求。 一般来说有三大块:接口,接口的实现(具体实现类),还有就是...
  • Java设计模式——工厂设计模式

    千次阅读 2018-05-21 17:59:06
    简单工厂设计模式的一个核心思想就是高内聚,低耦合,使具体的业务逻辑实现功能和效果展示分离开来。先给大家举一个没有应用到工厂设计模式的例子:题目:要求设计一个计算器程序,输入两个数和一个运算符号,计算出...
  • 什么是设计模式? 1、设计模式(Design pattern)是一套被...3、设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用 4、学习设计模式
  • Java设计模式工厂方法的Demo,具体的思想有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
  • Java设计模式,简单工厂的Demo,具体的思想与实现有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
  • Java设计模式,抽象工厂的Demo,具体的思想与实现有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
  • 对于Java来说,更重要得是设计的思想,和实现的架构,其次,才是技术细节。毕竟,Java语言的类库做的相当不错了,还有很多免费的工具包,另外,不用考虑内存的问题(递归造成的堆问题不在此列)因此在效率上问题不用...
  • Java工厂模式解耦 —— 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来。 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建,而是交给一个容器来创建和...
  • java设计模式学习笔记之计算器中的简单工厂模式 最近在重温设计模式,偶然看到程杰的《大话设计模式》写的非常不错、通俗易懂,之后的一系列都是学习的笔记,仅此记录。 一、情景回放:某校大二软件工程专业班的...
  • java设计模式:简单工程模式

    千次阅读 2018-06-28 20:37:12
    简单工厂模式: 概念:  就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的...
  • 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责...
  • Java设计模式

    2016-09-02 13:50:49
    Java设计模式》的目的是让读者不仅学习怎样在软件设计中使用好设计模式,更重要的是让读者通过学习使用设计模式深刻地理解面向对象的设计思想,以便更好地使用面向对象语言解决设计中的诸多问题。, 《Java设计模式...
  • Java 设计模式(一):简单工厂模式

    千次阅读 2018-11-22 10:03:08
    参考链接:简单工厂模式-Simple Factory Pattern 1. 模式定义 定义一个工厂类,它可以根据...简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程...
  • Java模式

    2018-01-29 14:45:23
    实用的 java 设计原则 和 设计模式,阅读完本书,可以了解java的api背后的设计思想和理念。1000多页巨著,只有超值,没有之一。 第1章 模式的简史和形而上学 第2章 统一建模语言UML简介 第12章 简单工厂\(Simple ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,120
精华内容 40,048
关键字:

java工厂模式思想

java 订阅