
24种设计模式案例
思维导图
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换只需换方言和驱动就可以。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
比如一次在中插入数十万条记录时,在完整恢复模式下每一个插入记录的动作都会记录在日志中,使日志文件变得非常大,在大容量日志恢复模式下,只记录必要的操作,不记录所有日志,这样一来,可以大大提高的性能,但是由于日志不完整,一旦出现问题,数据将可能无法恢复。2、按照上面的级别规范,在需要记录日志的地方记录日志,除了debug级别的日志其它日志不能记录过多,如果框架总是在运行的时候输出几十个warnning也容易让使用者忽略真正的问题。wingate代理防火墙管理局域网用户上网1、 代理服务可实现多种代理服务,包括www、telnet、smtp、pop3、ftp、socks等代理服务,并可以根据自己的需要添加诸如imap4、newsgroups代理.2、 安全验证在wingate的版中可以实现需用户在登录时必须输入用户名和密码才能通过wingate连接到internet的功能.3、 权限设置wingate的版可以对其用户进行权限管理,包括用户的登录时间、登录所在微机的ip或机器名,以及登陆站点和所请求的代理服务进行设置和限制.4、 计费winagte的版可以针对其每一个用户进行时间和流量进行计费管理.5、 对目前internet连接方式的支持wingate几乎支持目前所有的internet连接,从moden、isdn到ddn、xdsl等,但wingate目前的版本不支持vpn6、 远程管理通过wingate的远程管理程序gatekeeper可以实现对wingate server的异地管理.7、 缓存功能wingate提供的缓存可以储存大量的网页信息,有效提高浏览速度.8、 日志管理wingate的版可以针对其每一个用户和每一项代理服务进行日志记录,为企业的internet管理提供数据.9、 wgic(wingate客户端安装软件)客户端安装了wgic,用户无需再进行配置,就可以直接使用各种网络应用软件,联接internet.。
工厂模式 虽然object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用工厂模式的一种变体.function cr ...。与简单工厂类似,该模式用于创建一组相关或依赖的对象,不同之处在于静态工厂模式使用一个静态方法来创建所有类型的对象,该静态方法通常是 factory 或 build 。u建造模式与抽象工厂模式相比,都可以创建复杂对象,但建造模式着重于一步步构造一个复杂对象,抽象工厂模式着重于一系列的产品对象,相应地,建造模式是在最后的一步返回产品,抽象工厂模式的产品是立即返回的。
可以使用一些创建型设计模式,例如工厂方法,抽象工厂和原型模式。从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(staticfactory method)模式,但不属于23种gof设计模式之一。简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
封装操作实例来演示该方法的使用,但是fcntl在文件锁方面的控制在应用程序中有着一定的应用,下面将会就fcntl方法针对文件锁操作部分作详细的讲述。初学者可以通过前面介绍静态库的使用方法,自行实现该类类型的封装定义实现,将其编译为相应的库并在应用实例程序中尝试使用封装的低级文件操作类lowgradefileoperator实现基本文件操作功能。为了区别是否是创建控件的线程访问该控件,windows应用程序中每一个控件对象都有一个invokerequired属性,用来检查是否需要通过调用invoke方法完成其他线程对该控件的操作,如果该属性为true.说明是其他线程操作该控件,这时可以创建一个委托实例,然后调用控件对象的invoke方法,并传入需要的参数完成相应操作,否则可以直接对该控件对象进行操作,从而保证了其他线程安全操作本线程中的控件.。
优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
mybatis二级缓存对细粒度的数据级别的缓存实现不好,对同时缓存较多条数据的缓存,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。 函数对象 算法 stl算法本身是一种函数模版 通过迭代器获得输入数据 通过函数对象对数据进行处理 通过迭代器将结果输出 stl算法是通用的,独立于具体的数据类型、容器类型 stl算法分类 不可变序列算法 可变序列算法 排序和搜索算法 数值算法 * 算 法 不可变序列算法 不可变序列算法 不直接修改所操作的容器内容的算法 用于查找指定元素、比较两个序列是否相等、对元素进行计数等 例: template class inputiterator, class unarypredicate inputiterator find_if inputiterator first, inputiterator last, unarypredicate pred 。接着判断距上次数据被缓存时,指令所包含的脚本代码是否有更改(以便页面开发人员修改了 vm 脚本时自动刷新缓存数据),然后判断缓存中是否已有数据。
此时我们应该注意到synchronized修饰的是实例方法increase,在这样的情况下,当前线程的锁便是实例对象instance,注意java中的线程同步锁可以是任意对象。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。 //使用mybankaccount作为同步监视器,任何其他线程进入下边同步代码块之前必须首先获得mybankaccount账户的锁定,其他线程无法获得锁,也就无法修改共享资源对象的数据。
建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。四、builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。这个对象里有很多类似这样的约束,采用建造模式来构建复杂的对象,通常会对建造模式进行一定的简化,因为目标明确,就是创建某个复杂对象,因此做适当简化会使程序更简洁。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-110653-1.html
感觉放在家里能不缩水一样