关于该设计模式在 VFP 中的应用示例,我考虑了很久。最终决定以主程序的伪代码来做。它至少有两个作用: 1. 通过“主程序”这个过程化代码的重灾区的改造,体会 OOP 的设计思想; 2. 通过主程序的演变说明该模式的特点。 一个最简单的主程序,基本上需要完成以下功能:环境设置、路径设置、启动主UI。而在实际应用中,可能需要提供试用版、标准版和定制版。 *** 启动主UI *** Procedure StartUI() With _Screen .Visible = .T. .WindowState = 2 “它也许是创建型设计模式中最灵活最复杂的设计模式”
上一篇推文写了工厂方法模式,包括简单工厂模式、多工厂模式、静态工厂模式、抽象工厂模式,这篇推文记录一下单例设计模式 单例设计模式 在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 } } 懒汉式(线程安全) 优点:在多线程情形下, 保证了“懒汉模式”的线程安全。
前言 在软件开发的世界里,设计模式如同一本精妙的编码诗集,已经成为一种标准的编程实践。在Java编程中,设计模式很重要。 本人将制作一个关于Java设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源:Gitee点击跳转。在上一篇《Java设计模式(1)单例模式》文章中,我们介绍了单例模式。 本文是这个系列的第二篇章,我们将讲解一下工厂模式的实现方式、应用场景以及它的用途。 工厂模式 工厂模式是一种创建型设计模式,其主要目标是封装对象的创建过程,使客户端代码与具体类的实例化解耦。 应用场景 避免直接使用new操作符: 抽象工厂模式通过工厂接口的方法来创建对象,避免了直接使用 new 操作符实例化具体类。这样的设计更符合面向对象的原则,使得系统更易于扩展和维护。 manufactureCarFactory.createLincolnCar().manufacture(); manufactureCarFactory.createBenzCar().manufacture(); 输出: 结尾 选择使用哪种工厂模式取决于具体的需求和设计情况
单例模式单例模式属于创建型模式,⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。 用new创建对象时,其实是三步操作,不是原子操作:1.在堆内存申请空间2.调用构造方法,初始化对象3.将引用变量指向堆内存空间 为提高性能,处理器可能对代码执行顺序重新排序,如果运行顺序为1 3 2, static EagerSingleton getInstance() { return instance; }}线程安全,没加锁,效率高缺点是类加载就初始化,浪费内存空间有关创建型设计模式的内容就更新到这了 ,下一篇更新结构型设计模式的内容
该原则是作为一个指导思想来做的,其作用就是防止过度设计,但需要注意的是其是让你不做,但需要有可能要做的意识,提前留好拓展点,这样如果要做的时候,也可以快速跟上。 ** 后续会有一篇文章,来专门讲解如何在软件设计中,防止过度设计,但对对应该优化,该留好优化点如何实现。 这样的设计可能会导致以下问题, 当一个不知情的人看到这两段代码完成的任务是一样的,但采用的解决方式却是不一样的,则会想其的设计深意,以及不知道该用哪一个? true; } return validContainsA(temp); } 上述代码因为举的例子比较简单,应该能很简单的看出有一段代码被执行了两次,那么这样的设计违反了 迪米特原则 定义 迪米特原则是用来指导设计高内聚、低耦合代码的原则,因此我们先看一下什么是高内聚、低耦合。
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认识,而使事情特别难办。 把这个例子放到我们的软件设计中来,A可以放在客户端,起着事件的引导作用。 下面来举一个例子(例子来自《大话设计模式》): //送礼物 interface GiveGift //送礼物这个行为的接口 { void GiveDolls(); void GiveFlowers //调用代理类的方法,方法里面实际执行的是追求者的方法 daili.GiveFlowers(); daili.GiveChocolate(); Console.Read(); } } 这个模式其实不难理解 多动脑筋,把共同点找出来作为一个接口是关键… 本例子下载地址:https://files.cnblogs.com/mengxin523/代理模式.rar
Java 设计模式的相关原则 一、单一职责原则 单一职责原则: 应该有且仅有一个原则引起类的变更 单一职责可以简答的理解为,一个类或者对象,承担的只能应该尽可能单一。 单一职责用“职责”和“变化原因”来衡量接口或类设计得是否优良。但是“职责”的确定往往是无法度量的。 PS: 子类出现的地方,父类未必可以出现 在类中调用其他类时,务必使用父类或接口,如果不能使用,则说明类的设计已经违背了里氏替换原则(Liskov Substitution Principle,LSP 接口隔离原则需要保证的几个特性: 接口尽量要小: (在保证单一职责的情况小,尽量保证接口不过于臃肿) 接口要高内聚:(尽量减少与外界的交互,少公有,多私有) 定制服务: (为特定的服务对象提供其所需的方法) 接口设计是有限度的
举个例子: 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 内置的事件来实现观察者模式,比自己实现更简单,控制起来也更方便。
简介 工厂模式是在工作中第一次正式使用的(当然准确说是抽象工厂),所以作为第二篇的设计模式分享。 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 2、Hibernate 换数据库只需换方言和驱动就可以。 优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var Book = function(isbn, title, author) { if (isbn === 语法修饰增强型 用setattr,getattr等赋值取值方法及命名规范区别私有成员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 闭包实现私有成员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 实现静态方法和属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
2.模板方式结构图 3.实现模板方法模式 TemplateMethod就是炒菜的模板,定义了抽象方法。其中具体的实现是交给子类去做的。 Vegetables表示蔬菜的做法,其中定义了具体放多少调料和多少油以及具体的翻炒次数 测试输出结果,可以看到炒土豆和蔬菜虽然共用了一个模板,但是实际上做出来的确实2种不同的菜。 模板方法模式的优缺点如下 优点: 1.可以提取公共的代码(点火、起锅)这种公共的都是通过父类来定义而子类只需要继承。 2.同时扩展性强,需要整个更改流程的时候只需要更改模板,同时父类只需要定义顺序,子类来实现具体的内容。 缺点: 1.子类在做继承的时候必须要注意父类的具体顺序 2.如果模板中需要插入新的步骤,此时所有子类都需要进行实现(即使某些子类并不需要) 参考文献:《图解设计模式》
* 其他业务逻辑
如果像我之前对设计模式一无所知时,大概率会更改为以下的代码:
*!* 获取服务对象
*!* m.XMLWebServer = ......
*! * 其他业务逻辑
然鹅,这样的改动有 N 处......虽然根据熵增定律最终会混乱不堪,但是,谁也不想迅速的形成屎山......如果你理解了适配器设计模式,至少,可以减缓趋势。 首先,设计一个适配器类
***
经过以上分析,软件设计者们发现,可以将简单工厂方法模式中单一的工厂类改写为一个层次类来解决这个问题。 简单工厂方法模式与工厂方法模式的区别如下: 两个模式的中心不同。工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类(Concrete Factory Class)。 在简单工厂模式类中,工厂方法是静态(Static)的,而在工厂模式中工厂方法是动态的(Dynamic)。 简单工厂模式不支持开闭原则,工厂方法模式支持开闭原则。 因此工厂方法模式支持开闭原则。 在简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中;在工厂方法模式中,工厂类不必包含创建对象的逻辑判断。 在以下任何一种情况下,可以使用工厂方法模式。 工厂方法模式的优点如下: 工厂方法模式将创建对象的逻辑与任务交给了工厂类。 工厂方法模式支持开闭原则。
小谈设计模式(2)—简单工厂模式 专栏介绍 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。 简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过将对象的创建逻辑封装在一个工厂类中,客户端不需要知道具体的创建细节,只需要向工厂类请求所需对象即可 简单工厂模式组成 在简单工厂模式中,主要涉及三个角色:抽象产品、具体产品和简单工厂。 抽象产品(Abstract Product) 抽象产品是具体产品类的共同接口,它定义了产品的通用方法。 2、具体产品是抽象产品的实现类,负责实现抽象产品中定义的方法。 3、简单工厂作为一个工厂类,封装了对象的创建过程。它根据客户端的请求创建相应的具体产品对象,并返回给客户端使用。 总结 简单工厂模式是一种简单且常用的创建型设计模式,适用于创建对象较少且相对简单的场景。它封装了对象的创建过程,降低了客户端的复杂性,并且方便了产品类型的扩展和维护。
目录 场景描叙: 1、简单工厂模式 1.1、静态工厂模式 1.2、 使用反射机制进行类注册的简单工厂模式 1.3、使用 newInstance 方法进行类注册的简单工厂模式 2、工厂方法模式 2.1、 2)每个类应该只有一个发生变化的原因(单一职责原则); 而主类除了自身固有功能还要负责实例化 vehicle 对象,这种行为打破了单一职责原则。 所以这种情况下就需要一种更好的设计方案。 工厂方法模式 工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的 抽象工厂设计模式的实现如图 3-1 所示: 图 3-1 抽象工厂模式由以下类组成: AbstractFactory (抽象工厂类):抽象类,用于声明创建不同类型产品的方法。 ProductA2 和 ProductB2 来自第二个类簇,由 ConcreteFactory2 实例化。 结尾: 工厂的模式的核心就是右工厂类来负责合适对象的创建。
观察者模式: 存在两个对象 ,主题对象 与 观察者对象, 主题对象包含一系列观察者对象。 每当主题的状态改变时,都会通过调用观察者对象中的方法来通知所有观察者对象(MVC 模式中也包含了观察者模式)。 在程序设计时, 如果遇到一对多依赖的情况,首先要条件反射的想能否用观察者模式。 按照面向接口编程的原则, 存在主题对象、观察者对象, 则自然存在抽象主题对象以及抽象观察者对象, 静态类图如下: ? 在 .net 以及 jave内置了观察者模式 —— 事件。
分类 这里工厂模式分为2类:简单工厂 和 工厂方法,下一节会介绍第3类工厂模式:抽象工厂。 我们要知道,设计模式并不是为了减少代码行数而出现的,它是为了使我们的代码更好扩展,更好维护,更方便使用而出现的。那么使用简单工厂后,有什么好处呢? 每新增一类车,就要修改简单工厂类,这样做其实违背了设计原则中的开闭原则:对扩展开放,对修改封闭,同时如果每类车在实例化之前需要做一些处理逻辑的话,SimpleFactory 会变的越来越复杂。 定义 工厂方法模式又称为工厂模式,它的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中执行”。 通过上文可以知道,简单工厂在新增一款车的时候,需要修改简单工厂类 SimpleFactory,违背了设计模式中的**“开闭原则”**:对扩展开放,对修改封闭。
什么是工厂方法模式 我们有一个产品类,还有一个工厂接口,一个实现工厂接口的工厂类。产品对象的创建是依靠工厂类来创建。核心就是创建与使用分离。 decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses ” 工厂方法模式主要有下面的优点 : 通过工厂可获取产品,不用知道产品的具体创建过程 如果新增产品,不需要修改工厂,只需要添加新的工厂即可 然而这也成了工厂模式的缺点,无疑增加了系统的复杂度。 关于工厂方法模式的一点思考 产品本身不实例化,而是交给工厂去做。工厂方法是一个类的实例化延迟到了工厂类。 我觉得使用工厂方法的一个重要好处就是屏蔽了产品类。 这里就用到了工厂方法模式。 当然如果增加了产品类,对于是否增加工厂类,需要慎重考虑。毕竟这会增加系统复杂度。