前言 在软件开发的世界里,设计模式如同一本精妙的编码诗集,已经成为一种标准的编程实践。在Java编程中,设计模式很重要。 本人将制作一个关于Java设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源:Gitee点击跳转。在上一篇《Java设计模式(1)单例模式》文章中,我们介绍了单例模式。 本文是这个系列的第二篇章,我们将讲解一下工厂模式的实现方式、应用场景以及它的用途。 工厂模式 工厂模式是一种创建型设计模式,其主要目标是封装对象的创建过程,使客户端代码与具体类的实例化解耦。 每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。 简单工厂模式适用于对象较少且变化不频繁的情况,而抽象工厂模式适用于需要支持多个产品族的情况。利用好工厂模式可以帮助你更好地组织和管理代码,提高代码的可扩展性和灵活性。
举个例子: 1 // 声明委托 2 public delegate double MyDelegate(string s); 3 // 创建方法 4 public double GetStart(string testString); 5 // 实例化委托, 调用的方法需与委托有相同的参数、返回值 6 MyDelegate delegate = new MyDelegate(GetStart); 2、事件( e); 3 public event MyDelegateEventHandler MyEvent; 二、事件在观察者模式中的应用 举一个《Head First 设计模式》 上的经典应用,附件上有完整的代码 1、创建发布者类 1 // 发布者类 2 public class WeatherData 3 { 4 // 声明事件 5 public 我们可以发现,用 .net 内置的事件来实现观察者模式,比自己实现更简单,控制起来也更方便。
目录 场景描叙: 1、简单工厂模式 1.1、静态工厂模式 1.2、 使用反射机制进行类注册的简单工厂模式 1.3、使用 newInstance 方法进行类注册的简单工厂模式 2、工厂方法模式 2.1、 2)注册产品对象并向每个产品添加 newInstanse 方法,该方法返回与自身类型相同的新实例。 实现如 图2-1: 图2-1 2.1、案例场景:假设有一个汽车工厂,目前只生产两种车型,小型跑车和大型家用车。顾客决定买小还是大型。 它不再是创建单一类型的对象,而是创建一系列相关联的对象,如果说工厂方法模式中只包含一个抽象产品类,那么抽象工厂模式则包含多个抽象产品类。所以说工厂方法模式只是抽象工厂模式的一种特例。 ProductA2 和 ProductB2 来自第二个类簇,由 ConcreteFactory2 实例化。 结尾: 工厂的模式的核心就是右工厂类来负责合适对象的创建。
单例模式单例模式属于创建型模式,⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。 用new创建对象时,其实是三步操作,不是原子操作:1.在堆内存申请空间2.调用构造方法,初始化对象3.将引用变量指向堆内存空间 为提高性能,处理器可能对代码执行顺序重新排序,如果运行顺序为1 3 2, static EagerSingleton getInstance() { return instance; }}线程安全,没加锁,效率高缺点是类加载就初始化,浪费内存空间有关创建型设计模式的内容就更新到这了 ,下一篇更新结构型设计模式的内容
简介 工厂模式是在工作中第一次正式使用的(当然准确说是抽象工厂),所以作为第二篇的设计模式分享。 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 2、Hibernate 换数据库只需换方言和驱动就可以。 优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
2.模板方式结构图 3.实现模板方法模式 TemplateMethod就是炒菜的模板,定义了抽象方法。其中具体的实现是交给子类去做的。 Vegetables表示蔬菜的做法,其中定义了具体放多少调料和多少油以及具体的翻炒次数 测试输出结果,可以看到炒土豆和蔬菜虽然共用了一个模板,但是实际上做出来的确实2种不同的菜。 模板方法模式的优缺点如下 优点: 1.可以提取公共的代码(点火、起锅)这种公共的都是通过父类来定义而子类只需要继承。 2.同时扩展性强,需要整个更改流程的时候只需要更改模板,同时父类只需要定义顺序,子类来实现具体的内容。 缺点: 1.子类在做继承的时候必须要注意父类的具体顺序 2.如果模板中需要插入新的步骤,此时所有子类都需要进行实现(即使某些子类并不需要) 参考文献:《图解设计模式》
console.log("this is a message from a method in mosule"); } // 根据当前配置输出信息 myMethod2 // 输出this is a message from a method in mosule myModule.myMethod(); // 输出enable myModule.myMethod2( ); // 输出cn myModule.myMethod3({ language: "cn", useCaching : false }); 2. Module(模块)模式 JavaScript中,Mosule模式用于模拟类的概念,这种方式能够使一个单独的对象拥有公有/私有方法和变量,从而屏蔽来自全局作用域的特殊部分。 function privateMethod1(){ jQ(".container").html("test"); } function provateMethod2(
行为模式 行为模式是注意各个类之间的相互作用,讲过职责划分清楚,使得我们的代码更加清晰规范。 1.1策略模式 下面设计的场景是,需要画一个图形,可选的策略就是用红色笔来画,还是绿色笔来画,或者蓝色笔来画。 观察者的模式无外乎两个操作,观察者订阅自己关心的主题和主题有数据变化后通知观察者们。 1.4 模板方法模式 在含有继承结构的代码中,模板方法模式是非常常用的。 商品库存中心有个最基本的需求是减库存和补库存,我们看看怎么用状态模式来写。 核心在于,我们的关注点不再是 Context 是该进行哪种操作,而是关注在这个 Context 会有哪些操作。
今天来看看代理模式。首先要理解何为代理模式?啥时候用到代理模式? 当人A要做一件事情,但苦于无法和这个事情的当事人B认识,而使事情特别难办。 下面来举一个例子(例子来自《大话设计模式》): //送礼物 interface GiveGift //送礼物这个行为的接口 { void GiveDolls(); void GiveFlowers //调用代理类的方法,方法里面实际执行的是追求者的方法 daili.GiveFlowers(); daili.GiveChocolate(); Console.Read(); } } 这个模式其实不难理解 多动脑筋,把共同点找出来作为一个接口是关键… 本例子下载地址:https://files.cnblogs.com/mengxin523/代理模式.rar
在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品 地点: 湖南永州市蓝山县舜河村 作者:用心笑* Java设计模式-工厂模式(2)工厂方法模式 一、前言 1)概述: 2)角色结构: 3)类图关系: 二、代码实现 1)Coffce咖啡抽象类(产品抽象类 ) 2)AmericanCoffee 、LatteCoffee类(具体产品类) 3)CoffeeFactory(抽象工厂类) 4)AmericanCoffeeFactory、LatteCoffeeFactory 2)角色结构: 抽象工厂(Creator):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。 abstract void addMilk(); public abstract void addSugar(); public abstract String getName(); } 2)
导言 为了克服简单工厂方法模式的缺点,人们试图改善工厂类的结构。 简单工厂方法模式与工厂方法模式的区别如下: 两个模式的中心不同。工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类(Concrete Factory Class)。 在简单工厂模式类中,工厂方法是静态(Static)的,而在工厂模式中工厂方法是动态的(Dynamic)。 简单工厂模式不支持开闭原则,工厂方法模式支持开闭原则。 因此工厂方法模式支持开闭原则。 在简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中;在工厂方法模式中,工厂类不必包含创建对象的逻辑判断。 在以下任何一种情况下,可以使用工厂方法模式。 工厂方法模式的优点如下: 工厂方法模式将创建对象的逻辑与任务交给了工厂类。 工厂方法模式支持开闭原则。
* 其他业务逻辑 如果像我之前对设计模式一无所知时,大概率会更改为以下的代码: *!* 获取服务对象 *!* m.XMLWebServer = ...... *! * 其他业务逻辑 然鹅,这样的改动有 N 处......虽然根据熵增定律最终会混乱不堪,但是,谁也不想迅速的形成屎山......如果你理解了适配器设计模式,至少,可以减缓趋势。
关于该设计模式在 VFP 中的应用示例,我考虑了很久。最终决定以主程序的伪代码来做。它至少有两个作用: 1. 通过“主程序”这个过程化代码的重灾区的改造,体会 OOP 的设计思想; 2. 通过主程序的演变说明该模式的特点。 一个最简单的主程序,基本上需要完成以下功能:环境设置、路径设置、启动主UI。而在实际应用中,可能需要提供试用版、标准版和定制版。 *** 启动主UI *** Procedure StartUI() With _Screen .Visible = .T. .WindowState = 2 “它也许是创建型设计模式中最灵活最复杂的设计模式”
小谈设计模式(2)—简单工厂模式 专栏介绍 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。 简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过将对象的创建逻辑封装在一个工厂类中,客户端不需要知道具体的创建细节,只需要向工厂类请求所需对象即可 简单工厂模式组成 在简单工厂模式中,主要涉及三个角色:抽象产品、具体产品和简单工厂。 抽象产品(Abstract Product) 抽象产品是具体产品类的共同接口,它定义了产品的通用方法。 2、具体产品是抽象产品的实现类,负责实现抽象产品中定义的方法。 3、简单工厂作为一个工厂类,封装了对象的创建过程。它根据客户端的请求创建相应的具体产品对象,并返回给客户端使用。 总结 简单工厂模式是一种简单且常用的创建型设计模式,适用于创建对象较少且相对简单的场景。它封装了对象的创建过程,降低了客户端的复杂性,并且方便了产品类型的扩展和维护。
分类 这里工厂模式分为2类:简单工厂 和 工厂方法,下一节会介绍第3类工厂模式:抽象工厂。 我们要知道,设计模式并不是为了减少代码行数而出现的,它是为了使我们的代码更好扩展,更好维护,更方便使用而出现的。那么使用简单工厂后,有什么好处呢? 定义 工厂方法模式又称为工厂模式,它的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中执行”。 通过上文可以知道,简单工厂在新增一款车的时候,需要修改简单工厂类 SimpleFactory,违背了设计模式中的**“开闭原则”**:对扩展开放,对修改封闭。 ,增加新的子类时,需要修改工厂类,违背了“开闭原则”,并且工厂类会变得越来越臃肿; 简单工厂模式适用于固定的,不会频繁新增子类的使用场景 工厂方法模式 通过在上层再增加一层抽象,提供了接口,每个子类都有自己的工厂类
观察者模式: 存在两个对象 ,主题对象 与 观察者对象, 主题对象包含一系列观察者对象。 每当主题的状态改变时,都会通过调用观察者对象中的方法来通知所有观察者对象(MVC 模式中也包含了观察者模式)。 在程序设计时, 如果遇到一对多依赖的情况,首先要条件反射的想能否用观察者模式。 按照面向接口编程的原则, 存在主题对象、观察者对象, 则自然存在抽象主题对象以及抽象观察者对象, 静态类图如下: ? 在 .net 以及 jave内置了观察者模式 —— 事件。
上一篇推文写了工厂方法模式,包括简单工厂模式、多工厂模式、静态工厂模式、抽象工厂模式,这篇推文记录一下单例设计模式 单例设计模式 在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。 static void main (String[] args){ SingleTon s1 = SingleTon.getInstance(); SingleTon s2 = SingleTon.getInstance(); System.out.println(s1 == s2); //true } } 在静态方法创建实例并直接调用如果不是线程同步 = SingleTon.getInstance(); System.out.println(s1 == s2); //true } } 懒汉式(线程安全) 优点:在多线程情形下, 保证了“懒汉模式”的线程安全。
什么是工厂方法模式 我们有一个产品类,还有一个工厂接口,一个实现工厂接口的工厂类。产品对象的创建是依靠工厂类来创建。核心就是创建与使用分离。 decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses ” 工厂方法模式主要有下面的优点 : 通过工厂可获取产品,不用知道产品的具体创建过程 如果新增产品,不需要修改工厂,只需要添加新的工厂即可 然而这也成了工厂模式的缺点,无疑增加了系统的复杂度。 关于工厂方法模式的一点思考 产品本身不实例化,而是交给工厂去做。工厂方法是一个类的实例化延迟到了工厂类。 我觉得使用工厂方法的一个重要好处就是屏蔽了产品类。 这里就用到了工厂方法模式。 当然如果增加了产品类,对于是否增加工厂类,需要慎重考虑。毕竟这会增加系统复杂度。
-- 注意 1.对象字面量不需要使用new实例化; 2.不能用在一个语句的开头,否则可能会被解释为一个块的开始; --> 2.2 Module(模块)模式 JS中,Module模式用于进一步模拟类的概念 由于闭包的存在,声明的变量和方法只能在该模式内部可用。但在返回对象上 定义的变量和方法,外部使用者是能够调用的。 basketModule.addItem({ item: "酱油", price: 1.5 }); //输出结果 console.log(basketModule.getItemCount());//2 console.log(basketModule.getTotal());//0.5+1.5 = 2 //注意 console.log(basketModule.basket);//underfined 在Module模式中,代码的公有部分能够接触到私有部分,而外部代码无法接触到类的私有部分。
Redis 发布/订阅命令 Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了发布订阅模式。该功能提供两种信息机制, 分别是“发布订阅到频道”和“发布订阅到模式”。 PSUBSCRIBE 模式订阅命令 ? Redis 的发布与订阅实现支持模式匹配(pattern matching)。 客户端可以订阅一个带 * 号的模式,如果某个/某些频道的名字和这个模式匹配,那么当有信息发送给这个/这些频道的时候,客户端也会收到这个/这些频道的信息。 客户端订阅的模式里面可以包含多个 glob 风格的通配符, 比如 * 、 ? 和 [...] 等。 ,以及如何通过 Spring Data Redis 实现发布订阅模式。