一个无学历美国名人在世界名校耶鲁的演讲
工厂模式-简单工厂(设计模式的入门级模式—初级)(转自Linux中国)
工厂模式-工厂方法(模式进阶)Linux中国
工厂模式有以下几种形态:
简单工厂(Simple Factory)模式
工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式
抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式
本文综合了《thinking in Design pattern with java》,《Design pattern》,《爪哇语言简单工厂创立性模式介绍》以及我自己的观点,对factory 相关的设计模式进行详细的说明。
以下详细介绍工厂方法模式。
生疏的语言描述会使你越来越找不到学会工厂模型的方向,这是每个人都会感觉到的。所以我尝试给一篇代码,让大家现品尝一下胜利的果实。如果一次看不明白,不要着急,只要每个几天多看几次,你会感到跳跃性的理解!如果你能模仿这些代码写一些自己的工厂例子,感觉会来得更快。
假设你已经看了《简单工厂》那篇文章,并有了一丝基础,好,让我们继续。
package com.cc;
import java.unit.*;
interface book{
void sayBookName();
void sayBookPrice();
}
/*
书。---(工厂方法的研究代码)
*/
class ChineseBook implements book //中文书
{
private String name;
private int price;
public ChineseBook(){
this.ChineseBook("chinese",10);
}
public ChineseBook(String name,int price)
public void sayBookName(){
System.out.println("i am a chinese book "+name);
}
cc. Channel Pattern
public void sayBookPrice(){
System.out.println("my price is "+price);
}
//继承书店工厂
//
private static class Factory extends BookFactory //内部类的使用
{
protected Book create(){
return new ChineseBook();
}
}
static { //生成1个实例后,就要把这个实例加到工厂中
BookFactory.addFactory("EngishBook",new Factory())//为什么要把工厂 //放到list中呢?便于加载一次以后可直接调用
}
};
class EnglishBook implements book //英文书
{
private String name;
private int price;
public EnglishBook(){
this.EnglishBook("english",10);
}
public EnglishBook(String name,int price)
public void sayBookName(){
System.out.println("i am a english book "+name);
}
public void sayBookPrice(){
System.out.println("my price is "+price);
}
//继承书店工厂
//
private static class Factory extends BookFactory
{
protected Book create(){
return new EnglishBook();
}
}
static { //生成1个实例后,就要把这个实例加到工厂中
BookFactory.addFactory("EngishBook",new Factory())//为什么要把工厂
//放到list中呢?便于加载一次以后可直接调用
cc. Channel Pattern
}
};
abstract class BookFactory
{
protected abstract book create();//这个方法要在具体类中实现
private static Map factories = new HashMap();//工厂map
public static void addFactory(String id,BookFactory f)
{
//加入工厂,将书和创建书的工厂加入到map中,为什么要加入创建书的工厂呢? //因为创建书的工厂有个create()方法,他要具体返回一个实例
factories.put(id,f);
}
public static final Book createBook(String id){//创建书实例,书的名称作 //为参数,传出的是被创建好的Book的实例
if (!factories.containsKey(id))//当工厂中不包含这个类时要装载
{
try{
// Load dynamically 动态装载
Class.forName(id); //怎么加载的?只要直接执行
//这个类,类就会调用static里的语句
}catch(ClassNotFoundException e){
throw new RuntimeException("error"+id);
}
// See if it was put in 看看它是否被装载
if(!factories.containsKey(id))
throw new RuntimeException("Bad shape creation: " + id);
}
return ((BookFactory)factories.get(id)).create();
}
};
public class BookFactory2
{
String bookList[] = {"ChineseBook","EnglishBook","ChineseBook"
,"ChineseBook","EnglishBook"};
List books = new ArrayList();
public void text(){
for (int i=0;i
books.add(BookFactory.createBook(bookList[i]));
}
Iterator it = Books.iterator();
while(i.hasNext()){
cc. Channel Pattern
Book s = (Book)i.next();
s.sayBookName();
}
}
public static void main(String args[]) {
new BookFactory2().test();
}
};
这是根据《Thinking in pattern》所改造的一个例子,我画了很长时间才把这段代码理解。个人认为工厂方法本没有这么复杂,关键的是其作者用了几个很巧妙的方式,比如createBook()方法、将工厂放入Map、中等等。工厂方法是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给子类去作。工厂类BookFactory 中的createBook()方法本身并不创建new实例,它只返回具体的book实例,以下代码是个关键:
return ((BookFactory)factories.get(id)).create();
在解剖这个代码,假如id是“chineseBook”那么factories.get(“chineseBook”) 这个代码产生了什么呢?是一个工厂BookFactory的实例,这个实例是在ChineseBook类中创建的,理所应当是一个ChineseFactory实例,只是名字不会叫ChineseFactory,这个实例放到了factories这个Map中,本身也没有名字,通过id识别的。写了这么多,才弄懂了一点点,让我们继续。既然factories.get(id)是一个ChineseFactory实例,那么这个实例调用create()方法,那么返回一个new好的chineseBook实例是谁也不能反对的了。绕了这么多弯子,最后又回来了。很多人会问,为什么这么麻烦呢?这跟简单工厂有什么区别那?
我也觉得很麻烦,但我知道这是有很多优点的,再理解一下这句话“工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给子类去作。处于工厂方法模式的中心位置上的类甚至都不去接触那一个产品类应当被实例化这种细节。这种进一步抽象化的结果,是这种新的模式可以用来处理更加复杂的情形。”如果不能理解的请看我得解释,“子类决定如何实例化”,而工厂类不参与任何实例化行动,他只是根据参数选择那个子类去实例化。就好比,主板与其他部件如光驱、软驱等等,一旦有升级的需求,更换主板就是最麻烦,主板就相当于工厂类这个枢纽,工厂类枢纽不动最好!
在何时使用工厂方法呢?这其实是一个很重要的问题,《设计模式》这本书说得很笼统,他说,工厂方法应用于MVC中,我个人对MVC理解比较深刻,但还是不能很好的将工厂方法应用于其中。《程序员》一书中,将工厂模式应用于设计一个SQLBuilder语句生成器中,很有实际意义。我把这段代码给大家。
// SQLBuilder.java
public class SQLBuilder{
private ValueObject vo =null; //这是一个抽象创建器
public SQLBuilder(ValueObject aValueObject){
vo = aValueObject;
}
protect void getInsertSQL( ){
cc. Channel Pattern
// Get meta data
MetaObject mo = vo.getMetaDate(); // 核心部分,vo.getMetaDate()返回具体实例
//
}
public void insert(){
PreparedStatement ps = getInsertSQL();
Ps.executeUpdate();
}
public abstract class ValueObject{
//Create method
public MetaObject getMetaData();
}
public abstract class MetaObject{
}
public class CustomerVO extends ValueObject{
public MetaObject getMetaObject{
return new CustomerMO();
}
}
public class CustomerMO extends MetaObject{
// Methods
//实际上具体上这个类实现比较复杂,包含一系列的Field对象,同时设置字段
//的方法最终由Field类完成。
}
public static void main(String[] args){
CustomerVO cvo = new CustomerVO();
SQLBuilder sql = new SQLBuilder(cvo);
Sql. Insert();
……
}
}
工厂方法是创建型设计模式相对简单的一种,即便如此,我也感到了模式理解起来的可怕程度。给大家一个好的办法,那就是自己写一个模式的例子,然后记下心得,教给下一个朋友。
吴宗宪VS李敖
横睨一世、卓尔不群的李敖,其大起大落的人生经历,犹如一则现代传奇。
从文坛彗星到人人口诛笔伐的大毒草,从论战英雄到十四年牢狱之灾,被查禁的书有九十六种之多,李敖始终以横眉冷对千夫指的倨傲,纵笔所至不检束的文章,虽千万人吾往矣的气魄,坦然面对、顽强对抗。
同时,吴宗宪也是个话题人物,对他骂声不绝于耳,但支持他的人也是遍布各地。骂他的人,理由不外乎是,吴宗宪在主持节目时经常充满情色暗示;而支持他的人,已经将吴宗宪的许多搞笑语言当成口头禅。甚至很多人将他在节目中说过的话整理成册,推出"吴宗宪名言录",例如"长江后浪推前浪,前浪死在沙滩上"等语句,几乎被青少年们捧为至理名言。
李敖和吴宗宪两大名嘴,终于在台湾的JACKY SHOW综艺节目中碰撞了
吴:LANDIES AND GENTLEMENT!欢迎李敖!!大哥请坐,太开心了,来我们现场的观众再来一次热情的鼓励一下!其实李敖,李大哥也是我的一个人偶像了,我个人对于你是从喜欢到推崇,甚至于到模仿,我过去在电视节目里有模仿过你,你知道吗?
李:人表演得还不错,可是当时穿得那件红皮夹克太滥了。
吴:有没有看到啊,人家这样的谈吐跟过去的那个马克吐温一样,非常的有幽默感,然后又不会伤害到人家的自尊。在个人观点上,我觉得你是一个强者,你可以跟我们解释一下,你为什么总是以红色为你的标志呢?
李:因为年纪大了,我是1935年生的,我跟猫王同岁,你知道吧
吴:是,是..........他已经死了
李:喜欢颜色鲜艳一点,所以偶尔买了这么一件,我是不穿名牌的,可是买回来一看才知道它是名牌,这件夹克一万两千块
吴:一万两千块??
李:所以说你当时那件夹克有多滥啊。
吴:他说他这件夹克一万两千多啊,这大概以一个艺人的角度来看,算一件很普通的夹克了。(爆笑)
李:我会报告国税局来查查你的帐噢
吴:我们年轻人有很多问题想问你啊。来,小马第一道题目
马:李敖大哥,一般的民众对你的看法都是认为你属于大男人,而我们吴宗宪先生属于花心男人。所以我今天就想问一下大男人和花心男人一个问题,对你们而言,女人是什么?什么是真正的女人?
李:真正的女人就是你看了她以后,除了身体上一部分硬意外,其他全软了。(观众爆笑)
吴:不要这么大声好不好,我是看到之后会放很大,我是指瞳孔的部分。听说你也曾经公开过找过五个妓女,你又说要灵肉和一,可你找来的又是灵肉不合一的,请问...............
李:你这是断章取义,你忘了我在李敖回忆录里面说的,我是要同时做社会调查。
吴:对,这就跟我有一段时间也经常住在酒店,我也是为了帮助失学少女一样。好第二道题要问你一下。(爆笑)
马:宪哥啊,这么多绯闻当中,你到底愿意承认哪一个啊?
吴:这一点我要提出我的说明是,在演艺圈跟政治圈不一样了,在政治圈是NO NEW IS GOOD NEWS,而在演艺圈就不一样了,NO NEW IS BAD NEWS,没新闻你就完蛋了,代表你不红,有没有人在炒作小马的新闻啊?
马:没有啊。
吴:所以说你不红啊。
马:是,是.............那你到底愿意承认哪一个呢?这是问题的重点
吴:有人老是说我买房子给谁谁的,作为一个男人来讲,其实绯闻不重要,但是要懂得负责任。
马:对,对,对,关于这个负责任啊,宪哥他有自己的想法,他认为不做就不用负责任,做了才要负责任,那你是哪一个有要负责任的?
吴:没有,没有,这一点我跟李大哥想法一样,不做就不要负责,做了就要给钱。
李:其实有的人是不给钱的,像民进党的前主席施明德,他有三不主义:不主动,不拒绝,不负责。我曾经笑他三不主义,我说你不主动的话,你就爬不到美女身上;你不拒绝的话,丑女就爬到你身上;你不负责的话,现在DNA测验,你跑不掉的。(观众爆笑)
吴:太好了,这种说法让我们叹为观止。下一个问题.
马:在爱情当中灵与肉,如果只能选一样,你们会选哪一个?灵还是肉?
李:能选灵就选灵,选不到灵就选肉。
吴:那这一点跟我是相反的,我是先选肉,日后再观察有没有必要选灵。否则先选灵的话,如果日后发现两人合不来,结果肉也没吃到。
李:所以你有绯闻,我没有啊
吴: 我们现在做一个心里测验,性爱心里分析,请问下面哪一个新闻令你最不能接受了
A:少女被轮暴
B:离家少女被变态狂奸杀
C:少女被男友推入火坑接客
D:清纯少女被强暴
李:我选D
吴:小马,你会选哪一个呢?
马:我也选D.
吴:那么观众朋友肯定会认为我会问飞哥了,其实我会问吉他手,节目好看就好看在这里,变化多端的。然后走到吉他手这边,就问道鼓手这里,请问你会选哪一个?
鼓手:我会选............
吴:但是你的答案我们不听啊
马:宪哥你会选哪个?
吴:我会选择A
马:不会啊,你应该选择和你有关系的,你应该选C啊
吴:干什么啊,说出来。让我们来看看答案。选择A的专况是非常大男人主义,认为女孩子只能和一个男人发生关系。我是这样的人,但是它这个答案是根据我个人的器官所设计的,非常大!男人主义!不好意思噢,个人在构造上异于常人,天赋异常。让我们来看看李大哥的答案:潜意识里淫乱女生的倾向,哪一天你失去理智,可能会去嫖妓。请问李大哥个人对于这个心里测试有什么说法?
李:第一我觉得这个心里测验的分析师本身就是一个性变态,第二我从来就不会失去理智。
吴:对,对,对,这一点我相信,因为他根本没有理智,又怎么可能失去呢?可他说潜意识里有淫乱女生的倾向,这个是怎么回事呢?
李:因为我们人都有虐待狂和被虐待狂的潜意识,这个并不稀奇。就好像小狗咬你一口,你也想要他一口一样。
吴:小狗咬你一口,你也想要它一口?大哥你讲得是热狗吧?下面看我们的题目
马:李敖大哥是属于狂人型的,而我们宪哥是属于那种伶牙俐齿的,那么想问李大哥为什么要参选总统?
李:你们要我谈政治的噢?小心被剪掉噢!其实不为什么就是为了好玩。因为我写李敖大全集一千五百万字数,作李敖节目一千集,可是我觉得都没有像竞选总统一样使我在半年内被媒体注意,来宣传我的理念。
吴:这个我完全同意,因为媒体的力量是非常恐怖的,但是你有没有想过水可以载舟也可以覆舟啊?
李:我们这个船很大,覆不了我。
吴:噢,船很大,是自大吗?
李:很大,也很自大,比你的大
吴:不要这个样子啊!我们只是在做节目而已啊
李:他就害怕我说比他的大
吴:可是我们现在比的是长度啊!(观众爆笑)我们节目时间比较长。可是你只是为了好玩而竞选,这对于投你选票的老百姓来说,是不是有点.............
李:可是在这个好玩的过程里面,对年轻人的点化是我个人所取得的成就,使他们从受骗的过程中,解脱出来
吴:但是我个人认为第一个蒙受其利的是你个人,媒体的炒作是你身价水涨船高。你知名度大幅上扬,以前你就很红了,像我念中学的时候,最爱看的就是你的书,没有看过你的书等于是和时代脱节,等于是落伍,我这样讲,你会不会觉得很爽?听说你个人现在的主持费涨了10倍啊?
李:我的主持费表面上比你少,骨子里比你多,我只能说到这里了。
吴:请国税局也多加注意!
局域网中无法访问的解决方法(转)
使用JACOB进行Excel读写控制
使用JACOB进行Excel读写控制[本页面推荐在1024x768分辩率下浏览] 文章类别:Java |
| 网站目录: 网站首页 —> Java |
转载自:www.csdn.net 1、 下载JACOB包:http://danadler.com/jacob/ 2、 安装配置 解压jacobBin_17.zip (1)jacob.dll所在目录放到PATH中 (2)jacob.jar放到CLASSPATH中 3、使用jacob进行Excel控制,下面是我写的一个测试程序代码
import com.jacob.com.*; class ExcelTest //读取值 |
JACOB技术探讨之一
http://danadler.com/jacob/index.html
文化差异
=文化差异1=
日本的一家公司要招聘10名员工,经过一段严格的面试,公司从三百多征者中选出了10位佼佼者。
放榜这天,一个叫水原的青年看见榜上没有自己的名字,悲痛欲死,回到家中便要切腹自杀,幸好亲人及时抢救,水原没有死成。
正当水原悲伤之时,从公司却传好消息:
水原的成绩原是名列前矛的,只是由于电脑的错误导致了水原的落选。
正当水原一家人欣喜若望之时,从公司又传来消息:水原被公司除了名。原因很简单,公司老板说:如此小的挫折都受不了,这样的人在公司是不成什么大事的。
=文化差异2=
美国的一家公司要招聘10名员工,经过一段严格的面试,公司从三百多征者中选出了10位佼佼者。
放榜这天,一个叫汤姆的青年看见榜上没有自己的名字,悲痛欲死,回到家中便要举枪自尽,幸好亲人及时抢救,汤姆没有死成。
正当汤姆悲伤之时,从公司却传好消息:
汤姆的成级原是名列前矛的,只是由于电脑的错误导致了汤姆的落选。
正当汤姆一家人欣喜若望之时,美国各大州的知名律师都来到汤姆的家中,他们千方百计的鼓励汤姆到法院告这家公司,声称需支付巨大的精神赔赏,并自告奋勇的充当汤姆的律师。
=文化差异3=
德国的一家公司要招聘10名员工,过一段严格的面试,公司从三百多征者中选出了10位佼佼者。
放榜这天,一个叫萧恩的青年看见榜上没有自己的名字,悲痛欲死,回到家中便要跳河自尽,幸好亲人及时抢救,萧恩没有死成。
正当萧恩悲伤之时,从公司传来好消息:萧恩的成绩原是名列前矛的,只是由于电脑的错误致了萧恩的落选。
当萧恩欣喜若望之时,萧恩的父母却坚决反对自己的儿子进入这家公司。他们的理由不容置疑:进入这家公司作业效率如此差劲,进入这家公司儿子的成绩毫无益处。
=文化差异4=
中国的一家公司要招聘10名员工,经过一段严格的面试,公司从三百多征者中选出了10位佼佼者。
放榜这天,一个叫志强的青年看见榜上没有自己的名字,悲痛欲死,回到家中便要悬梁自尽,幸好亲人及时抢救,志强没有死成。
正当志强悲伤之时,从公司传来好消息:志强的成绩原是名列前矛的,只是由于电脑的错误致了志强的落选。
正当志强欣喜若望之时,志强的父母来到公司,一看到公司老板便跪了下来。他们含泪的说:多亏你救了我儿子,我们家世世代代感谢你的大恩大德!
=文化差异5=
台湾的一家公司要招聘10名员工,经过一段严格的面试,公司从三百多征者中选出了10位佼佼者。
放榜这天,一个叫水扁的青年看见榜上没有自己的名字,悲痛欲死,回到家中便要磕药自杀,幸好亲人及时抢救,水扁没有死成。
正当水扁悲伤之时,从公司传来好消息:水扁的成绩原是名列前矛的,只是由于电脑的错误致了水扁的落选。
正当水扁欣喜若望之时,媒体大幅报道并邀请水扁参加各种CALL IN的评论及综艺节目。热烈讨论电脑为何会出错,是否有黑道介入或官商勾结。至于水扁到底有没有去该公司上班,根本没有人关心。