第一篇:设计模式-创建型模式的优缺点比较
比较几种创建型模式的优缺点,仔细考察这几种模式的区别和相关性。
第一类是工厂模式,工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。
工厂模式有三种形态:简单工厂模式;工厂方法模式;抽象工厂模式是。前两者是类的创建模式,后者是对象的创建模式。
简单工厂:
简单工厂模式是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,涉及工厂角色(Creator)、抽象产品(Product)角色及具体产品(Concrete Product)角色等三个角色。
优点:
模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。
简单工厂模式实现了对责任的分割。
缺点:
当产品类有复杂的多层次等级结构时,工厂类只有它自己。
模式中工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类。
将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。
该模式采用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。
简单工厂模式只在有限的程度上符合“开-闭”原则。
工厂方法:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。工厂方法模式是简单工厂模式的进一步抽象和推广,其基本思想是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
优点:
多态性:客户代码可以做到与特定应用无关,适用于任何实体类
子类可以重写新的实现,也可以继承父类的实现。加一层间接性,增加了灵活性。良好的封装性,代码结构清晰。扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
缺点: 需要Creator和相应的子类作为工厂方法的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。
抽象工厂:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,客户端不必指定产品的具体类型,创建多个产品族中的产品对象。
优点:
分离了具体的类,一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离易于交换产品系列,只需改变具体的工厂就可以使用不同的产品配置。
有利于产品的一致性,当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象。
缺点:
难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。
单例模式:
一个类仅有一个实例,自行实例化并向整个系统提供一个访问它的全局访问点。确保一个类只能被实例化一次。
优点: 跨平台:使用合适的中间件,可以把singleton模式扩展为跨多个JVM和多个计算机工作。适用于任何类:只需把一个类的构造函数变成私有的,并且在其中增加相应的静态函数和变量,就可以把这个类变为singleton。
可以通过派生创建:给定一个类,可以创建它的一个singleton子类。
延迟求值:如果singleton从未使用过,那么就绝不会创建它。
缺点:
摧毁方法未定义: 没有好的方法去摧毁一个singleton,或者解除其责任。
不能继承:从singleton派生的类并不是singleton。如果要使其成为singleton,必须要增加所需的静态函数和变量。
效率问题:每次调用instance方法都会执行if语句,多余。
不透明性: singleton的使用者知道它们正在使用一个singleton,因为它们必须要调用instance方法。
建造者模式:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的对象。
优点: 建造模式的使用使得产品的内部表象可以独立地变化。使用建造模式可以使客户端不必知道产品内部组成的细节。
每一个Builder都相对独立,而与其他的Builder无关。模式所建造的最终产品更易于控制。
缺点:
建造者模式的“加工工艺”是暴露的,这样使得建造者模式更加灵活,也使得工艺变得对客户不透明。
原型模式:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。以一个已有的对象作为原型,通过它来创建新的对象。在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来。
优点:
原型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此增加新产品对整个结构没有影响。
原型模式提供简化的创建结构。工厂方法常需要有一个与产品类相同的等级结构,而原型模式不需要。
具有给一个应用软件加载新功能的能力。
产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。
缺点:
每一个类必须配备一个克隆方法。
配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
关系总结: 工厂方法模式是简单工厂模式的扩展,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。如果只有一个具体工厂类,工厂方法模式可以改造为简单工厂模式。抽象工厂经常用工厂方法来实现。Prototype:不需要创建Creator的子类,但它们通常需要一个针对Product类的Initialize操作。抽象工厂模式是对象的创建模式,是工厂方法模式的进一步推广。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。工厂方法模式针对的是一个产品等级结构;抽象工厂模式需要面对多个产品等级结构。Singleton与其他创建型模式并不矛盾,可以用Singleton来实现其他模式中的对象。包括Abstract Factory、Builder、Prototype等。Builder和Abstract Factory都可以创建复杂的对象。但是Builder模式着重于一步步构造一个复杂的对象,强调的是产品的内部组成,Abstract factory着重于多个系列的产品对象。Builder在最后一步返回产品,而Abstract factory立即返回产品。
Abstractor Factory处于更为具体的角度,Builder处于更宏观的角度。一个系统可以由一个建造模式和一个抽象工厂模式组成,客户端通过调用这个建造模式,间接地调用另一个抽象工厂模式的工厂角色。工厂模式返还不同产品族的零件,而建造模式把它们组装起来。8 Prototype和Abstract factory往往是竞争的关系,但是它们也可以一起使用。抽象工厂可以存储一个被克隆的原型的集合,并返回产品的对象。
第二篇:模式比较
玫琳凯模式---顾问交友式
1.皮肤分析卡 预约:了解基本信息、提前准备课前:了解皮肤问题,了解需求点课后:满足需求、强化需求
2.美容课讲义夹
讲文化、企业:对公司认同、文化认同讲皮肤知识:打造专业形象
规范护肤步骤:强化需求、专业信服产品试用: 亲身体验 满足需求
结束报价:让情感上接受、心中有数促销快报:物超所值 达成销售
女主人礼物展示:达成延伸和刺激分享
3.售后服务送货上门,打开试用,规范护肤步骤:拉近距离针对全面需求给予全套护理流程:
完整的护肤步骤和建议、专业和规范讲解让人信服、贴心服务逐步解决顾客需求,有专业的解决方案
了解喜好、邀约相关活动、了解他周围的人,让他成为女主人、邀约更多人、用她的分享带动销售
4.事业机会手册:针对不同需求有不同版本的事业机会分享,有针对性的感情投入,既能成为优质的主顾,也能有机会成为事业机会的合作者。
保险改进模式-------专业理财顾问
1.预约:了解基本财务状况
授前:了解财务困惑、了解需求点授中:强化需求、满足需求 2.理财课堂 讲轻松氛围讲文化、企业
讲理财重要、基本理财工具运用讲家庭理财组合(4321)讲保险意义与功用
3.售后服务强化理财理念,投资组合意识给予资产分类管理方案对每种方案的注意事项
对家庭成员完整的保险计划
理赔会出现的问题,给予对应的解决方案
保险个人销售行为-----------专业个人理财规划师 从卖保险-------销售理财计划
对立的关系---------依赖信任的关系根本是解决问题的能力、让他成为你满意的顾客让他的分享给你带来源源不断地利润,所以情感投入,全身心的售前、售后专业全面的服务才是赢得客户心的唯一途径,这样保险的营销就 不成问题。
关键在于专业
第三篇:英文写作---比较型说明文的模式
比较型说明文的模式
第一步:审题
1.A Major Advantage or Disadvantage of Playing Computer Games
2.The Advantages and Disadvantages of Air Travel
3.Some people believe that a college or university education should be available toall students;others believe that higher education should be available only to goodstudents.What’s your opinion?
第二步:构思
模式
I(该模式用于比较两个事物,作者的倾向比较明显时)
第一段, 引言句(现象或事实陈述法)引出要比较的两个事物
(A 或B)用一句话表明自己的观点(如:倾向A)
第二段, 段落主题句承接首段中的观点,并对本段内容加以限定
比较之一:
指出A事物的优点之一, 用拓展句加以说明.通过转折指出B事物的缺点, 用拓展句加以说明.比较之二:
指出A事物的优点之二, 用拓展句加以说明.通过转折指出B事物的缺点,用拓展句加以说明.(A1B1A2B2A3B3 point-by-point pattern)
第三段, 得出结论,注意首尾观点一致.Television As a Better Source of NewsAmong the three mass media—television, newspaper and radio, I regard television as a better source.My statement that television is a better source of news is based on the following two reasons.The first reason is that television can report news more quickly.We can get the news at the same time when something is happening or immediately after something happened.While newspapers can only offer the news that happened a day or two days ago.The second reason is that television can report news more vividly and impressively.With sounds and pictures on TV, we can be deeply impressed by the news as if we were personally on the spot.But when we try to get news from the newspaper, we have to concentrate our mind on the lines and use our imaginations to for a concrete image, which is always tiresome and time-consuming.According to the above mentioned reasons;we can easily draw a conclusion that television is really a better source of news.模式II
如果作文要求比较两个事物的不同之处,宜用下列结构:
第一段, 引言句(一般用现象陈述法,提问)引出要比较的两个;主题句指出的两个事物存在着明显的差异或两个事物的不同特点.第二段, 直接评述A事物的主要特点,用拓展句加以说明(举例,一般阐述);指出B事物的主要特点,用拓展句加以具体明.(A1A2A3B1B2B3
subject-by-subject pattern)
第三段, 通过比较得出倾向性的结论, 表明作者的态度.Where to Live–in the City or the Country
Many people appreciate the conveniences of the city.The city has better transportation service and health care.City dwellers can easily enjoy themselves in restaurants, department stores and concert halls.They are well-informed about what is going on at home and abroad, and have the access to better education, better jobs and more opportunities for business.But country life is also attractive.With the fresh air, the green trees and the singing birds, country people are close to nature and live a quiet life.They can make friends with simple and honest men or wander about leisurely without any pressure upon their mind.Both the country and the city, however, have their own disadvantages.In the country, educational facilities, medical services and transportation systems are still not fully developed.And the city also has many problems, such as heavy traffic, air pollution, great noise and poor housing conditions.As far as I’m concerned, I hated the terrible dirt and noise in the city.So, given the chance, I would prefer to live peacefully in the country.The Main Difference Between Exam-oriented Education and Quality-oriented Education
Education in China used to be exam-oriented one.But with the development of education reform, quality-oriented education is stressed again and again.So there rises a question: what is the main difference between these two?
Accordingto my understanding, exam-oriented education focuses on students’ ability of passing examination of different levels.This education is to test the students command of knowledge they
have obtained from the textbooks.So examination results are the only criterion which is used to evaluate the students whether they are “excellent” ones or “bad” ones.However, quality-oriented
education focuses on students’ various qualities, including academic moral quality, cultural quality, most important, their individual personality and potentialities.The main purpose of this education is to bring students’ practical potentialities into full play.Quality-oriented education can teach students how to face difficulties and solve problems independently.From the above comparison between exam-oriented education and quality-oriented education, we find that the latter one is superior.So it is time for our universities and colleges to bring quality-oriented education into students’ daily life.比较一个事物的两个方面的时候也可以用这种模式:
第一段, 引言句引出要比较的两个方面(advantage & disadvantage)
第二段, 直接评述advantage,用拓展句加以说明(举例,一般阐述);然后再指出disadvantage,用拓展句加以具体明.(A1A2A3B1B2B3 subject-by-subject pattern)
第三段, 通过比较得出倾向性的结论, 表明优劣或作者态度.The Advantages and Disadvantages of Air Travel
In the last fifty years, traveling by air has become the most popular form of long-distance journeys.However, there are both positive and negative associated with it.The first advantage of air travel is that it is quick.For instance, we can fly from Beijing to Guangzhou in less than three hours.The second advantage of traveling by air is that it is convenient.After we have checked in, all we have to do is to get on and sit down.The friendly air stewardess will look after our every need.The third advantage of traveling by air is that it is now relatively cheep, especially for long distance travel.We can fly from Beijing to Guangzhou for only 1200 Yuan.But on the other hand, traveling by air has its disadvantages.Perhaps the most obvious is the element of danger involved, such as hijackings and crashes.Traveling by air also makes it impossible for us to see many scenic spot on the way to our destination.In addition to the above mentioned, a long distance air travel may make us very tired, both mentally and physically.Many precious days of holiday may be wasted recovering from airsickness.To conclude, although air travel involves inconvenience and slight risk, I would say that the advantages mentioned above weigh much more than the disadvantages.Exercise:
With the development of computer, the Internet has become widely used.It is just like information net that has covered the world.Some people worry that it provides too much for people.Write a composition of about 200 words to state your view on this issue.Does the Internet Provide Too Much for People
When a great deal of information is exchanged on the Internet almost every second, some people worry that it provides too much for people.To know it clearly, we should look at both sides of the Internet.On one hand, the Internet shows us a closer and wider world than ever before.Just staying at home, we can get all kinds of useful information in any scientific research field whenever we need.Through the Internet, more and more chances are provided to improve our work, enrich our knowledge and help our country to keep up with the others.But on the other hand, the Internet also brings us many troubles.Useless information and games send to us unavoidably.From this angle, we have to say that those people’s complaints are understandable.Generally speaking, the Internet has played an important role in modern life.It is like a double-edged sword.We should make the best use of one edge, and try not to be hurt by the other one.模式III
(该模式用于比较两个事物时作者的倾向比较明显)
第一段, 引言句引出要比较的两个事物;主题句概括地指出其中一个事物的优点和缺点。
(倾向于A)
第二段, 只评述A事物的优点,用拓展句加以说明(举例,一般阐述);指出A事物的缺点,用拓展句加以具体明.第三段, 通过比较得出倾向性的结论, 表明作者的态度.这样类似于比较一个事物的两个方面。
Sharing a Room with a Stranger or Living by Yourself
Nowadays, more and more college students like to live off campus.Some prefer to share a flat with somebody else to divide the rent between them and others prefer to have a flat to themselves.There are always two aspects to one situation.Sharing a flat with somebody else has its advantages and disadvantages.Study requires peace and quietness.A stranger who shares a room with you may disturb you.Your thoughts can be interrupted by his sudden return, or by asking for a light, or merely by his cough or sneeze.At night, when you want to sleep, he may be tossing in bed, making enough noise to keep you awake.If the stranger is bad-tempered, he may quarrel with you, and yet, you must have patience.However, there are many positive aspects of sharing a room with a stranger.First, with another person in the room, you will not feel lonely although far way from you home.Second, you can always help each other.Whatever difficulty you are in, you can get a helping hand.If the person you live with is a senior student, you can even get advice from him on your work and study.Third, living with a stranger offers you a chance of learning to get along with people.Since you have to live with a stranger for quite a long period, you will do your best to make friends with him.If you are successful in gaining his trust, you may also be successful in the more complicated and competitive society.Therefore, I think, sharing a room with a stranger is a good arrangement of living for all the disadvantages.I prefer to share a flat with someone else rather than live alone.Where to Live– in the City or in the Country
Each year thousands of people rush into big cities.Some come for education, some for shopping and some on business.But most of them, attracted by the job opportunities and modern life, come to stay.People enjoy city life chiefly for its conveniences.To begin with, the city provides fast transport, with roads and buses leading to every corner.Then, there are department stores and shops all over the city, where you can buy all kinds of goods you want.Besides, hospitals and other services are
all within easy reach.Indeed, whatever your need is, you can easily get what your want.However, ig cities are confronted with many problems.One is the housing problem.For examples, it is not uncommon for two or even three generations to share an apartment.Another problem is pollution.The air is not clean and the environment is noisy.In short, the city is only a place for business, to be visited occasionally.It is not an
ideal place for permanent living.模式IV
第一段, 引言句引出要比较的两个事物;主题句鲜明地表明作者的态度—倾向其中一个(如:
A)。
第二段, 只评述A事物的优点,用拓展句加以说明(举例,一般阐述)
第三段, 总结A的优点,再次表明态度,和第一段里态度一致。
这种方式就将比较型的说明文变成了阐述型的说明文。
Where to Live– in the City or in the Country
There are undeniable advantages to both life in a big city and in a small town.However, despite the advantages of small town life, I prefer to live in a big city for several reasons.First, life in the big city is more convenient.More goods are available and stores stay open later.Also, there is better public transportation, so it is easier to get around.I can find almost anything I want easily in the city.Second, there are more ways to spend leisure time in the city.There are many places I can go to meet friends and have fun.Finally, and most importantly, the city offers more educational and job opportunities.The city often attracts the best teachers and the best companies.There is also a wider choice of jobs so it is easier to move up the career ladder.For all these reasons, I prefer to live in the city.Although I sometimes miss the fresh air and quiet life of a small town, nothing can make up for the opportunities that the city offers.Exercise:
Some people believe that a college or university education should be available to all students;others believe that higher education should be available only to good students.What’s your opinion?
Opening University Doors to All Students
Some people believe that university education should be available to all students.Others believe that higher education should be limited to only good students.I think universities should open their doors to all students.Those who argue for the availability of university education to good students think that having only good students study in university would save the government’s fund.However, these people neglect one fact that most school graduates are too young to work.These young people, especially the so-called bad students, since they are refused by colleges and universities, have nothing to do and would easily form gangs.Those who argue for the availability of higher education to all students believe that every student should have the equal right to education.Besides, when mass students have university education year after year, the education lever of the whole society will finally get promoted, resulting in a better quality of the nation.Apparently, opening university doors to all students benefits the society and
the whole nation;therefore, it is a better choice for us to take.
第四篇:JAVA设计模式之创建模式
设计模式之Builder
Builder模式定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到.为何使用?
是为了将构建复杂对象的过程和它的部件解耦.注意: 是解耦过程和部件.因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开.如何使用?
首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示.首先,需要一个接口,它定义如何创建复杂对象的各个部件: public interface Builder {
//创建部件A 比如创建汽车车轮
void buildPartA();
//创建部件B 比如创建汽车方向盘
void buildPartB();
//创建部件C 比如创建汽车发动机
void buildPartC();
//返回最后组装成品结果(返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.//从而实现了解耦过程和部件
Product getResult();} 用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品: public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;} // 将部件partA partB partC最后组成复杂对象 //这里是将车轮 方向盘和发动机组装成汽车的过程 public void construct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
} } Builder的具体实现ConcreteBuilder: 通过具体完成接口Builder来构建或装配产品的部件;定义并明确它所要创建的是什么具体东西;提供一个可以重新获取产品的接口: public class ConcreteBuilder implements Builder {
Part partA, partB, partC;public void buildPartA(){
//这里是具体如何构建partA的代码
};public void buildPartB(){
//这里是具体如何构建partB的代码 };public void buildPartC(){
//这里是具体如何构建partB的代码 };public Product getResult(){
//返回最后组装成品结果 };} 复杂对象:产品Product: public interface Product { } 复杂对象的部件: public interface Part { }
我们看看如何调用Builder模式: ConcreteBuilder builder = new ConcreteBuilder();Director director = new Director(builder);
director.construct();Product product = builder.getResult();Builder模式的应用
在Java实际使用中,我们经常用到“池”(Pool)的概念,当资源提供者无法提供足够的资源,并且这些资源需要被很多用户反复共享时,就需要使用池.“池”实际是一段内存,当池中有一些复杂的资源的“断肢”(比如数据库的连接池,也许有时一个连接会中断),如果循环再利用这些“断肢”,将提高内存使用效率,提高池的性能.修改Builder模式中Director类使之能诊断“断肢”断在哪个部件上,再修复这个部件.设计模式之Factory
定义:提供创建对象的接口.为何使用?
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A()工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。我们以类Sample为例,如果我们要创建Sample的实例对象: Sample sample=new Sample();可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等。
首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成: Sample sample=new Sample(参数);但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
在本例中,首先,我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。
这时我们就需要Factory工厂模式来生成对象了,不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample.我们要实例化他们时,如下: Sample mysample=new MySample();Sample hissample=new HisSample();随着项目的深入,Sample可能还会“生出很多儿子出来”, 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.工厂方法
你会建立一个专门生产Sample实例的工厂: public class Factory{
public static Sample creator(int which){
//getClass 产生Sample 一般可使用动态类装载装入类。if(which==1)
return new SampleA();else if(which==2)
return new SampleB();
} } 那么在你的程序中,如果要实例化Sample时.就使用 Sample sampleA=Factory.creator(1);这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类,用来生成产品Sample,如下图,最右边是生产的对象Sample:
进一步稍微复杂一点,就是在工厂类上进行拓展,工厂类也有继承它的实现类concreteFactory了。抽象工厂
工厂模式中有: 工厂方法(Factory Method)抽象工厂(Abstract Factory).这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个concrete类Sample2A和SampleB2 那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现,下面就是将上例中的Factory拓展成抽象工厂: public abstract class Factory{
public abstract Sample creator();
public abstract Sample2 creator(String name);} public class SimpleFactory extends Factory{
public Sample creator(){
.........return new SampleA } public Sample2 creator(String name){
.........return new Sample2A } } public class BombFactory extends Factory{
public Sample creator(){
......return new SampleB } public Sample2 creator(String name){
......return new Sample2B } }
从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问,为什么我不可以使用两个工厂方法来分别生产Sample和Sample2? 抽象工厂还有另外一个关键要点,是因为 SimpleFactory内,生产Sample和生产Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,这个工厂类有其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫SimpleFactory。在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用,举例
我们以Jive的ForumFactory为例,这个例子在前面的Singleton模式中我们讨论过,现在再讨论其工厂模式: public abstract class ForumFactory {
private static Object initLock = new Object();
private static String className = “com.jivesoftware.forum.database.DbForumFactory”;
private static ForumFactory factory = null;
public static ForumFactory getInstance(Authorization authorization){
//If no valid authorization passed in, return null.if(authorization == null){
return null;
}
//以下使用了Singleton 单态模式
if(factory == null){
synchronized(initLock){
if(factory == null){
......}
}
} try {
//动态转载类
Class c = Class.forName(className);
factory =(ForumFactory)c.newInstance();} catch(Exception e){
return null;}
//Now, 返回 proxy.用来限制授权对forum的访问
return new ForumFactoryProxy(authorization, factory,factory.getPermissions(authorization));
}
//真正创建forum的方法由继承forumfactory的子类去完成.public abstract Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException;
....}
因为现在的Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口: private static String className = “com.jivesoftware.forum.database.DbForumFactory”;你可以使用自己开发的创建forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果.看看Java宠物店中的CatalogDAOFactory: public class CatalogDAOFactory {
/**
* 本方法制定一个特别的子类来实现DAO模式。
* 具体子类定义是在J2EE的部署描述器中。
*/
public static CatalogDAO getDAO()throws CatalogDAOSysException {
CatalogDAO catDao = null;
try {
InitialContext ic = new InitialContext();//动态装入CATALOG_DAO_CLASS //可以定义自己的CATALOG_DAO_CLASS,从而在无需变更太多代码 //的前提下,完成系统的巨大变更。
String className =(String)ic.lookup(JNDINames.CATALOG_DAO_CLASS);
catDao =(CatalogDAO)Class.forName(className).newInstance();
} catch(NamingException ne){
throw new CatalogDAOSysException(“
CatalogDAOFactory.getDAO: NamingException while
getting DAO type : n” + ne.getMessage());
} catch(Exception se){
throw new CatalogDAOSysException(“
CatalogDAOFactory.getDAO: Exception while getting
DAO type : n” + se.getMessage());
}
return catDao;
} } CatalogDAOFactory是典型的工厂方法,catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类,这个实现子类在Java宠物店是用来操作catalog数据库,用户可以根据数据库的类型不同,定制自己的具体实现子类,将自己的子类名给与CATALOG_DAO_CLASS变量就可以。
由此可见,工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制,只要我们更换一下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功能进行改头换面的变化。
设计模式之Prototype(原型)
定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。如何使用? 因为Java中的提供clone()方法来实现对象的克隆(具体了解clone()按这里),所以Prototype模式实现一下子变得很简单.以勺子为例:
public abstract class AbstractSpoon implements Cloneable {
String spoonName;
public void setSpoonName(String spoonName){this.spoonName = spoonName;}
public String getSpoonName(){return this.spoonName;}
public Object clone()
{
Object object = null;
try {
object = super.clone();
} catch(CloneNotSupportedException exception){
System.err.println(“AbstractSpoon is not Cloneable”);
}
return object;
} } 有两个具体实现(ConcretePrototype): public class SoupSpoon extends AbstractSpoon {
public SoupSpoon()
{
setSpoonName(“Soup Spoon”);
} } public class SaladSpoon extends AbstractSpoon {
public SaladSpoon()
{
setSpoonName(“Salad Spoon”);
} } 调用Prototype模式很简单: AbstractSpoon spoon = new SoupSpoon();AbstractSpoon spoon = new SaladSpoon();当然也可以结合工厂模式来创建AbstractSpoon实例。
在Java中Prototype模式变成clone()方法的使用,由于Java的纯洁的面向对象特性,使得在Java中使用设计模式变得很自然,两者已经几乎是浑然一体了。这反映在很多模式上,如Interator遍历模式。
设计模式之Singleton(单态)
定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。
还有, singleton能够被状态化;这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。
另外方面,Singleton也能够被无状态化。提供工具性质的功能,Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。如何使用?
一般Singleton模式通常有几种形式: public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
}
第二种形式: public class Singleton {
private static Singleton instance = null;public static synchronized Singleton getInstance(){
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!if(instance==null)
instance=new Singleton();return instance;} //这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
} }
使用Singleton.getInstance()可以访问单态类。
上面第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉及double-checked locking(DCL)的讨论,有兴趣者进一步研究。
一般认为第一种形式要更加安全些。使用Singleton注意事项:
有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的。
我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocator为例稍微分析一下:
在Pet Store中ServiceLocator有两种,一个是EJB目录下;一个是WEB目录下,我们检查这两个ServiceLocator会发现内容差不多,都是提供EJB的查询定位服务,可是为什么要分开呢?仔细研究对这两种ServiceLocator才发现区别:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator属于资源定位,理所当然应该使用Singleton模式。但是在EJB中,Singleton模式已经失去作用,所以ServiceLocator才分成两种,一种面向WEB服务的,一种是面向EJB服务的。
Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对Java的类 线程 内存等概念有相当的了解。进一步深入可参考:
Double-checked locking and the Singleton pattern When is a singleton not a singleton?
第五篇:审计模式的比较
审计模式的比较 审计模式是审计导向性的目的、范围和方法等要素的组合,它规定了审计应从何处着手、如何着手以及何时着手等方面。按照历史发展的顺序,审计模式经历了账项基础审计模式、制度基础审计模式、风险导向审计模式三个阶段。由于各阶段的导向性目标不同,所采用的审计程序和方法也有所不同,但是三个阶段相互之间并非孤立,而是存在承前启后的关系。
一、账项基础审计模式
特点:(1)以会计事项为主线,在审查会计事项的基础上开展审计工作,工作量较大,适应早期审计的需要。
(2)主要目标是查错纠弊,但不审查内部牵制制度,不对内部牵制制度发表评价意见。
(3)主要采用查账的方法。它要审查被审计单位在审计期间内关于会计事项的会计记录及其有关凭证,验算其会计金额,核对转账事项,以证实账簿和报表数字的正确性。
(4)没有区分阶段、步骤,没有固定的审计程序,也不重视着手审计前的准备工作,只要求了解被审计单位的概况和搜集试算表、总账、明细账等会计资料,然后直接审查会计事项。
(5)此阶段形成了丰富的审计方法和技术,并沿用至今,主要包括:①书面资料审计方法②财产物资审计方法③分析性复核方法。
二、制度基础审计模式
特点:(1)主要目标是确定会计报表的公允性,尽管也揭露错误和舞弊,但只是因为错误和舞弊会影响财务报表的公允性。
(2)在评价内部控制的基础上确定审计的重点和范围,并非传统的详细审计,可以在保证审计结论具有一定可靠水平的前提下提高审计工作效率。
(3)形成了标准化的审计程序,一般包括计划、实施、完成三个阶段,重视审计计划阶段,并把内部控制的评审作为关键步骤,审计范围和重点都比较明确。
(4)除采用账项基础审计的技术方法之外,还引入了对内部控制的符合性测试和审计抽样。
三、风险导向审计模式
风险导向审计模式经历了从传统风险导向审计向现代风险导向审计的转变。
现代风险导向审计模式与传统风险导向审计模式的主要区别:
(1)从审计风险模型来看,传统风险导向审计的风险模型为
审计风险=固有风险*控制风险*检查风险
而现代风险导向审计的风险模型为
审计风险=重大错报风险*检查风险
(2)从审计思路来看,传统风险导向审计模式一般采用自下而上的审计方式,以企业的内部控制为审计起点,以内部控制风险评估为风险评估的重心;而现代风险导向审计模式主要从企业内外部环境、经营风险分析入手,以此来发现可能出现重大错报的领域及评估被审计单位的会计政策和会计估计的适当性,加强了对固有风险的评估,同时仍未完全放弃自下而上的审计方式。
(3)从审计程序来看,传统风险导向审计模式在实务中存在重程序、轻风险的倾向,而
现代风险导向审计模式则针对不同的客户、不同的风险领域采取不同的审计程序,对分析性程序也更为重视。
现代风险导向审计模式更能适应现代审计环境的变化,它要求注册会计师一重大错报风险的识别、评估和应对为审计工作的主线,以提高审计效率和效果。