学校Windows7系统Dr.com加winpcap抓包上网经常掉线的解决方法

本人笔记本电脑是惠普g4系列,由于惠普与微软有合作计划,所以g4系列由于硬件关系只能安装Dr.comwinpcap抓包上网啊,dr.com有一个支持windows7的版本即dr.com 3.73。但是只能在windows7旗舰sp2上正常运行,如果你的是windows7旗舰sp3哪就会不定时的掉线,我一开始在网上找了很多解决的方法(开启ARP防火墙,换winpcap与dr.com版本,但是v3.72是在windows7旗舰sp3下无法在正常安装的(盗版的也许能),有人也叫删除杀毒软件,或是用windows7优化大师……,都没有解决问题。换来的是提示(1.软件安装完成,请重新启动,但无论你重启多少次都还有提示,就是不能正常上网 2.该端口其它程序占用,请退出后运行,还有其它的……,总之看到其它同学都在cf,听歌,看新闻,心理哪是撕心裂肺。

下面进入正题,要怎么才能让Windows7系统Dr.com加winpcap抓包上网不掉线

  1. 首先请卸载电脑上的winpcap和dr.com
  2. 安装dr.com v3.73版本、3.73自带有winpcap 安装最后一步不能运行dr.com
  3. 重启电脑,等待重启过程中去同学win xp上复制他安装的3.72版的安装文件夹,一般在C:\Program Files\ dr.com宽带认证客户端
  4. 电脑开启后打开自己电脑里的C:\Program Files删除dr.com宽带认证客户端文件夹
  5. 将在同学哪里复制的 dr.com宽带认证客户端文件夹 粘贴到C:\Program Files
  6. 启动C:\Program Files\ dr.com宽带认证客户端\ishare_user.exe 就会正常上网了,当然也可以发个快捷方式到桌面哈(原来桌面的哪个快捷方式是不能用的)

本文主要是面对与电脑无关专业的人群,才写的这么复杂,如果你是电脑高手也许对dr.comwinpcap抓包上网很了解了,也就不用看此文章。或者扫一眼就知道怎么做了。欢迎大家转载分享,自己或朋友也许有能用到的一天。(文/付庆)

转载请保留本文出处地址:http://mtoou.info/windows7-dr-com-winpcap/

为摩托罗拉ME525 Defy性能平反 实况足球流畅运行

原先因为701的关系对摩托罗拉MIUI。闲来无事,就给Defy装了些高端游戏跑跑,出乎我的意料,konami实况足球流畅运行,切水果也没有明显卡顿了,除了武士2和卡通渲染的roboto强退外,几乎都可以完美运行,包括ea的dark.日本厂商的Dgunner.gl的艾登的觉醒。性能十分给力。

而且摩托罗拉ME525 Defy这机子刷机包也比较多,官方MIUI包还是比较好用的。再加上三防特性,只要不是性能控,这款MOTO ME525智能手机基本可以满足所有的要求了,液晶显示效果还比较细腻,毕竟小屏装着高分辨率。(文/琦琦小猪)转载请保留本文出处地址:http://mtoou.info/moto-me525-defy-xingneng/

桌面回收站图标不见了?回收站图标没了?3种方法快速解决

出现桌面回收站图标不见了的情况一般都是在别人的电脑上,这是别人为了保护隐私而设置了隐藏回收站,偶尔也出现在我们自己的电脑上,这可能是设置不当造成的,还有很多人在网吧上网也会发现回收站图标没了的情况。

那么桌面回收站图标不见了能不能找回来呢?答案是肯定的,下面穆童介绍3种方法可以让你找回桌面的回收站。

直接找回桌面回收站图标

这个方法是我用的最多的,也是最有效的。能够在桌面上重新创建回收站图标。和没有消失前的回收站图标没有任何区别,所以你创建这个图标之前删除的内容都可以在这个里面看到。具体方法是在桌面新建一个文件夹。将其命名如下:(下面红色字一个不少全部要输入才行)

回收站.{645ff040-5081-101b-9f08-00aa002f954e}

用运行调出回收站

在这种情况只需要使用“运行”(快捷键Win+R)或是命令行调出回收站打开了。大家只要点击“开始”→运行,然后在“运行”窗口中输入以下代码:

explorer.exe ::{645FF040-5081-101B-9F08-00AA002F954E}

输入以上代码后回车即可看到调出的回收站了。但使用这个方法你的电脑桌面回收站图标依然是看不见的。所以还是建议用上面那个快捷又实用的方法找回桌面回收站图标。

修改本地策略组

很多时候在别人的电脑上发现回收站图标不见了大多都是因为他们秀给了自己系统中的本地策略组,那里面有一个“从桌面删除回收站”的功能选项,只要选中了你桌面上的回收站图标就没了。而我们也可以这样做,方法是:打开“运行”输入gpeddit.msc打开本地策略编辑器,然后依次点击:

本地计算机策略→用户配置→管理模板→桌面→双击右边窗口中“从桌面删除回收站”选项

然后在弹出的对话框中选中“未配置”点确认后即可解决回收站图标不见了的问题,如下图:

回收站图标不见了的解决方法

你也可以通过这个本地策略组来隐藏回收站以保护个人隐私。以上就是我总结的三种回收站图标没了的解决方法,大体上都应该能解决大家的实际问题。三种方法前两种其实差不多,后面那种应用性更强,不过如果用的是别人的电脑最好别改了这个设置,别人会发现的哦。

说说iPhone PUSH是什么及iPhone QQ PUSH在线功能

iPhone PUSH是什么?其意思是推送,再简单理解就是:不需要运行程序,就可以实时获取到本程序相关的信息。

例如iPhone的QQ PUSH在线功能和带有PUSH邮件功能的黑莓手机~黑莓手机之所以之前在国外能火,很大部分是国外运营商可以用到黑莓的服务,再简单点理解就是我不用没事有事开着手机的邮件功能来第一时间知道有没有新的邮件,完全不用打开,当邮件服务器第一时间来邮件的时候会第一时间直接推送到你的手机,这样你觉得老美人需要彩信这个功能不?短信都不需要,邮件就代替了,从费用上来说邮件只走流量(没算黑莓服务的费用),虽然说不停地刷新也可以实现此功能~但是鉴于手机的流量、电量比较下来还是PUSH更好点~

iPhone QQ PUSH功能原理就不多说~大致和黑莓的一样~只是iPhone的所有软件理论都可以支持PUSH(这取决于软件开发者),简单理解就是用如果开着推送通知服务,iPhoneQQ登陆一次,他就会在线,当你退出了iPhoneQQ也会在别人的好友里面显示iPhone PUSH在线~显示PUSH在线的时候,你可以对PUSH在线的发消息~直接会实时弹出来在手机屏幕,就跟普通短信没差多少,如下图:

iPhone QQ PUSH功能

iPhone QQ PUSH功能

如图1显示我用我另外一个号码发了一个123过来~会以这种形式显示在手机上~如果我选择”关闭“则不打开QQ程序阅读此条信息。如下图:

iPhone QQ PUSH功能

iPhone QQ PUSH功能

如图2是选择关闭以后的,QQ上面多出了个数字2(是下面那个QQ,上面那个是老版本的,很久没用了),也就是再次有2条没有用手机阅读的PUSH消息,~如果我选择“显示”,则会自动打开QQ,然后QQ会这条信息到的QQ~当然推送的消息是QQ消息~~推送过的消息不算事腾讯给你发了~~也就是说~如果我选择“关闭”~然后用电脑登陆这个QQ号码~也是会收到消息的~~~对此也应该发现了一个比较严重的问题~尽量不要用自己的QQ号码在别人iphone的QQ里面登陆~~不然话没设置好的话会推送消息的~~泄露自己的隐私可不是什么好事吧~哈~~不过腾讯的QQ推送只有iPhone手机退出后48小时(这个时间段还是取决于软件开发者的),如果48小时内没用手机登陆就不会PUSH在线了~~如果错过来了后来需要PUSH,就在登录一次吧~然后就又有48小时~

当然iphone上的很多软件都有PUSH功能,尤其是社交方面软件,例如:微信(当有人给你发微信消息或者QQ离线消息的时候就给你推送过来),QQ空间(当有人给你QQ空间留言或者评论什么的能扯到你的都给PUSH的),腾讯微博(当有人提到你,或者私信都会实时PUSH过来),这也是我为什么喜欢用iphone的原因之一,有了这个PUSH,QQ不在需要跟其他手机那样挂着了(浪费电~浪费流量)~网上看到有些小白总是说什么iphoneQQ不能挂着不能后台的~~我只想说~你可以改变其他手机用QQ的那种习惯了~~一样的效果,为什么要挂着呢?虽然说PUSH会保持手机和Apple的PUSH服务器有一条安全的连接,当然这个PUSH是走流量的~~这个PUSH一月所用的流量,少的完全可以忽略不计~

相信现在大家应该知道iPhone PUSH是什么了吧,还有iPhone QQ PUSH这个功能是不是很好用?(文/亨! 转载请保留本文出处地址:http://mtoou.info/iphone-qq-push-shenme/

散热好的笔记本需要这样维护!笔记本温度高者必看

笔记本电脑的散热问题是大家在买电脑以及日后的使用过程中都是非常注重的一点,因为笔记本散热问题影响着其稳定性。所以我在使用笔记本电脑过程中总结出以下影响笔记本散热效果的几点。希望对大家有所帮助。

降低CPU使用率

一flash这个东西还是很占CPU资源的~尤其是运行mac系统的笔记本电脑上~看flash视频要比html5视频温度高20度左右~而windows系统上好点~大约能高10度,所以为了笔记本散热停用flash(或者flash开关)然后找个能看html5视频的浏览器是很有必要的~

巧用电源管理器

CPUGPU过热,而且CPU和GPU配置也还不错时~在windows7电源管理里面适当把最大的CPU、GPU调低点,例如我平常不怎么玩游戏,我把最大cpu调到50%,GPU也调到最低或者中等,这样就CPU本身就不是很热。

散热底座想用就用

至于笔记本散热板(俗称散热底座吧)~我觉得没多大用~如果想用用,也可以考虑入个~别买太烂的~买就买个好点的~这个不好的甚至起反作用~神马风扇转速高噪音大震动大的~转速小有不起作用~~总之这个东西可有可无。

清理灰尘很有必要

很有必要对笔记本半年清一次灰,(尤其是风扇这个地方以及显卡散热铜片上——穆童注)~一年重新涂一次硅脂~这个改善很大的,弄了之后散热会好很多~不过也需要动手能力~没有经验的别乱弄~

让笔记本透透气吧

找四个稍微高的垫脚把电脑垫起来(看看这里:2元打造笔记本超强散热)也会好点。随便找个包装箱泡沫的哪个稍微加工一下就可以了~有散热板的就不用考虑这条了,另外保证散热孔旁边没啥遮挡的~

键盘保护膜?坑爹!

笔记本键盘保护膜是个坑爹的玩意~我个人从来不用~如果你在用这个,电脑散热不好的话就去掉这个吧~大多数电脑散热还是很依赖键盘的~试问你见过几个笔记本先是键盘坏的?

暂时只想到这些~综合这几个基本上保证凉爽一点是没有问题的~我笔记本电脑在一直在床上褥子上放着听着歌曲看着网页的温度:CPU风扇2000转~基本上听不到风扇声音,感觉散热良好。(文/享! 转载请保留作者及原文出处链接:http://mtoou.info/bijibensanre-zongjie/

VHD安装Windows 8 build 7989过程及发现与Windows7的几处雷同

首先先说一下我电脑ubuntu10.04和windows7英文旗舰版(主要用来修复系统的,当PE使),逻辑分区是一个windows公用的文件分区和一个linux-swap分区。其中英文windows7自己单独引导,引导分区在第三主分区,其他的两个由第一主分区的BCD引导(活动的),至于怎么用windows7的BCD引导iso镜像文件,用安装器找到wim(source文件夹下的install.wim),安装系统到你的VHD,引导也设在VHD上,大概10分钟吧就完成了。下一步是添加win8的引导,这点容易,用魔方或者bootice添加一个windows7的启动项,系统的目录就是VHD上安装了系统的那个分区。重启

进入选择新添加的引导,会看到windows8的启动画面,刚开始可能小鱼下面的旋转的进度条显示不出来,其他正常。第一次进入会提示windows is preparing for first use,然后是setup drivers,再然后是windows is starting severs,然后就重启了

重启后启动画面还不正常,进入到一个类似windows RE的环境中,能看到透明效果已经开开了,上面还是提示windows is preparing for first use,然后再重启

再次启动后还提示windows is preparing for  fitst use进入windows RE,弹出一个命令行窗口,飞快的显示一堆东西再重启。

第四次启动后终于能看到完整的启动画面了,提示你输入安装信息,什么地点,时区都知道怎么填吧,语言一定要选chinese prc 不然没有中文输入法和中文支持,工作组名称必须是英文的(打进去中文说forbid words),不过用户名可以弄成中文的,比如说我用的“幻儿”只是字体貌似不是微软雅黑有点难看。激活就免了吧,毕竟9月就出beta了

进入系统后自然第一件事是解锁功能,这个去网上找解锁工具,百度上一屏一屏的,三下五除二解锁后重启一次来欣赏windows8的样子吧。

当然可以配置图形密码了,进入控制面板(control panel)→User Accounts and Family Safety→User Accounts→set up a pattern for pattern logon,设定吧,注销后从其登录选择pattern,OK,享受windows8 7989吧。

Windows8 7989同于windo7的新版UI

Windows8 7989同于windo7的新版UI

虽然这个windows8 7989版本还写的是windows7但是内核是nt6.2(windows7是6.1),内部版本号也是7989了(windows7是7600,windows7SP1是7601)

虽然这个windows8 7989版本还写的是windows7但是内核是nt6.2(windows7是6.1),内部版本号也是7989了(windows7是7600,windows7SP1是7601)

同样提示是windows7旗舰版,但是编译时间是2011

同样提示是windows7旗舰版,但是编译时间是2011

windows8新的任务管理器,能直接管理启动项

windows8新的任务管理器,能直接管理启动项

windows 8 build 7989的任务管理器

windows 8 build 7989的任务管理器

Windows8 build 7989新的IE浏览器,虽然提示是IE9但是下面的浏览模式的IE10

Windows8 build 7989新的IE浏览器,虽然提示是IE9但是下面的浏览模式的IE10

(文/飄渺の幻兒)转载请保留原文地址http://mtoou.info/windows8-build-7989-tiyan/

Java设计模式之State状态模式

网上也看些文章,有的模式和我写的差不多,有的就差别就很大,思路根本不一样。这不一定说谁对谁错,某些模式实现方式就有很多。还有网上一大堆的文章很多都一样,不一定是大家的观点,有些就是抄来抄去而且不带出处的,太坑爹了。

我说过我的JAVA文章仅代表一家观点,本人又是个彩笔,有什么错误在所难免。不过我还是要认真研究研究,也不能一味盲目相信。

今天还是继续写文章,Java设计模式系列之State状态模式。状态我们很熟悉了,像进程调度啊,线程运行啊,Hibernate中的实体类都有状态,这一步的状态是什么,要做什么,下一个状态又是什么,都需要确定。但是我们要判断事务的状态,有很多比如IF/ELSE ,SWITCH(),不过这样会导致大量的判断代码,网上就有一些大湿就提出IF/ELSE已死的说法,大牛就是意识超前啊,很多人现在就提出NOSQL设计,不见得就能被广泛的采用,有数据库巨头像Oracle肯定不同意撒,思想就是百家争鸣嘛,感兴趣的话了解了解。当然IF/ELSE太多的话很定不好撒,而且你要增加状态怎么办,像Android中的Activity的生命周期有七个状态,有人就说加IF/ELSE呗,用的地方太多难道要一个一个的改么。

我们的State状态模式就解决这个问题,这里就用四个状态,多了也一样,就是多加几个类,这就使得State模式的缺点暴露出来了,状态太多了有几十个就不宜用这个模式了。我们有一个State接口,其它的状态类实现这个接口,有四个状态类Create,Start,End,和Destroy。

State接口代码
package org.javaer.code.pattern.state;

import java.util.ArrayList;
import java.util.List;

public interface State {
        List<State> commands  = new ArrayList<State>();
 public void handle();
}

Create状态类代码
package org.javaer.code.pattern.state;

public class Create implements State {

        public Create() {
      commands.add(this);
        }
 @Override
 public void handle() {     
      execute(this);      
 }

 public void execute(State command){
     System.out.println(“create”);
     commands.get(commands.indexOf(this)+1).handle();
 }
}

Start状态类代码
package org.javaer.code.pattern.state;

public class Start implements State{

    public Start() {
 commands.add(this);
    }
 @Override
 public void handle() {
     execute(this);     
 }

 public void execute(State command){
     System.out.println(“start”);
     commands.get(commands.indexOf(this)+1).handle();
 }
}

End状态类代码
package org.javaer.code.pattern.state;

public class End implements State {

    public End() {
 commands.add(this);
    }
 @Override
 public void handle() {
     execute(this);
 }

 public void execute(State command){
     System.out.println(“end”);
     commands.get(commands.indexOf(this)+1).handle();
 }
}

Destroy状态类代码
package org.javaer.code.pattern.state;

public class Destroy implements State {

    public  Destroy() {
 commands.add(this);
    }
 @Override
 public void handle() {
     execute(this);
 }

 public void execute(State command){
     System.out.println(“destory”);
     //我这里加了这一句,就是想让它循环的转换状态,就会导致内存溢出
     commands.get(commands.indexOf(this)>=commands.size()-1?0:commands.indexOf(this)+1).handle();
 }
}

测试类Main代码
package org.javaer.code.pattern.state;

public class Main {
 @SuppressWarnings(“unused”)
 public static void main(String[] args) {
  State state1 = new Create();
  State state2 = new Start();
  State state3 = new End();
  State state4 = new Destroy(); 
  state1.handle();
 }
}

输出:
create
start
end
destory
create
start
end
destory
create
start
end
destory
.
.
.
.
.
Exception in thread “main” java.lang.StackOverflowError
 at sun.nio.cs.UTF_8.updatePositions(Unknown Source)
 at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(Unknown Source)
.
.
.
当然了状态处理handle方法没做啥子,就打印了个单词。
如果不想出现内存溢出(没有写方法停止),就把最后一个状态的handle方法的循环调用的一句代码去掉。
好了,状态模式就写完了,下面还是常用的Java设计模式,敬请持续关注。。。。
MSN:donglinmei@hotmail.com 
Skype:donglinmeimei 转载请注明出处http://mtoou.info/java-state-moshi/

Java设计模式之Factory工厂设计模式

首先向大家道个歉,这篇文章出的慢。其实呢,我也费了很大的劲来写的,从礼拜天就开始写了,后来因为小区停电了,没有保存,后面不得不重新写了。嗯,昨天晚上又是写到12点了,今天是公司培训,中午回家吃了泡面又接着写下去。下午非常累吧,中途睡着了,财务培训的检测做的很差,估计要挂了,希望不要找我回来再培训啊。条件比较幸苦吧,不管怎么样,我还是必须坚持下去,嗯,加油!!!

这期的文章是Java设计模式系列之Factory工厂模式,内容相对呢多一些,但是我会尽量把她写详细清楚。

工厂模式呢有三种,简单工厂模式工厂方法模式抽象工厂模式。基本掌握前两种就可以了,第三种要慢慢理解,我也是慢慢体会才弄明白的,呵呵,大家应该比我聪明,更容易理解。

简单工厂模式
简单工厂模式就是根据条件产生对象,比如条件为1产生什么对象,条件为2产生什么对象。。。嗯,我这里没有这么做,为了方便起见就打印了句话。
package org.javaer.pattern.factory;

public class SimpleFactory {
    //这里就用到了singleton单例模式
    private static SimpleFactory factory = new SimpleFactory();
    private SimpleFactory(){}
   
    public static SimpleFactory getInstance(){
        return factory;
    }
   
    public void factory(int type){
        if(type==1){//条件为1,打印KFC鸡翅
            System.out.println(“KFC’s chicken wing”);
        }else if(type==2){//条件为2,打印麦当劳鸡翅
            System.out.println(“Mcdonald’s chicken wing”);
        }else{//其他情况,没有鸡翅
            System.out.println(“no chicken wing”);
        }
    }
   
    public void factory(String type){
        if(“KFC”.equals(type)){
            System.out.println(“KFC’s chicken wing”);
        }else if(“Mcdonald’s”.equals(type)){
            System.out.println(“Mcdonald’s chicken wing”);
        }else{
            System.out.println(“no chicken wing”);
        }
    }
    public static void main(String[] args) {
        SimpleFactory simpleFactory = SimpleFactory.getInstance();
        simpleFactory.factory(1);
        simpleFactory.factory(“Mcdonald’s”);
    }
}

——————————————————————————————-简单工厂模式完

我们就可以在配置文件里配置我们要产生的对象的全名就可以了,比如erp.cfg.properties 文件中这样配置org.javaer.erp.dao.DAO=org.javaer.erp.dao.impl.DAOSupport
调用的时候就传入通过读取配置文件得到的Properties类,根据key得到value。有这个字符串,那就容易啦,就像你有了数据库的驱动类的类路径
就用Class.forName(“classname”).newInstance();得到对象,同理是吧。这样就可以通过配置来得到提高系统的可维护性,后面你要是替换实现了,就只要
该配置文件好啦,比如org.javaer.erp.dao.DAO=org.javaer.erp.dao.impl.DAOImpl,那么系统用到这个的时候就会自动全部换掉,而不用一个一个的更改,
是不是方便多了呢。

工厂方法模式
工厂方法我就不多说了,就是多态嘛,父类或接口引用不同的子类对象。我这里用的例子是快餐店生产快餐,有点尴尬了,我不提倡吃快餐的,又贵又没有营养。不过吃的时候貌似不得以而为之,呵呵,下次坚决不吃。
package org.javaer.pattern.factory;

public class FactoryMethod {

    public static void main(String[] args) {
        Store store = new KFCStore();
        store.makeFood();//KFC卖鸡翅
        Store store1 = new McdonaldStore();
        store1.makeFood();//麦当劳卖汉堡
    }

}

//快餐店卖食物
interface Store{
    public Food makeFood();
}
//KFC卖快餐(kfc鸡翅)
class KFCStore implements Store{
    public Food makeFood(){
        return new Food(“KFC wing”);
    }
}
//Mcdonald卖快餐(Mcdonald汉堡)
class McdonaldStore implements Store{
    public Food makeFood(){
        return new Food(“Mcdonald’s hamburger”);
    }
}
//食物类(鸡翅、汉堡)
class Food{
    String name = null;
    public Food(){}
   
    public Food(String name){
        this.name = name;
    }
}

如果你要开个必胜客快餐店,写个类实现Store接口就好了,业务就扩展了。

//必胜客卖食物(披萨)
class Pizzahut implements Store{
    public Food makeFood(){
        return new Food(“Pizza hut pizza”);
    }
}
用的时候就用Store store = new Pizzahut();store.makeFood();
——————————————————————————————————-工厂方法模式完
抽象工厂模式

抽象工厂呢就是在工厂方法模式上面在包一层,因为你的业务可能还需要根据不同的情况产生不同的工厂。
比如我们要有FoodFactory食物工厂,又要有SoftFactory软件工厂。。。那我们就在上面加一层用来产生工厂。而工厂又去生产产品(工厂方法)
package org.javaer.pattern.factory;
//抽象工厂
public abstract class AbstractFactory {

    public abstract FoodFactory createFoodFactory();
    public abstract SoftFactory createSoftFactory();
//测试main方法,懒得再写一测试类
    public static void main(String[] args) {
       
AbstractFactory abstractFactory = new AbstractFactorySupport();
  //产生一级工厂FoodFactory
  FoodFactory foodFactory = abstractFactory.createFoodFactory();
  foodFactory.makeFood();
  System.out.println(“==============================”);
  //产生二级工厂KFCFactory
  KFCFactory kfcFactory =  foodFactory.createKFCFactory();
  kfcFactory.makeFood();
  //产生二级工厂McdonaldFactory
  McdonaldFactory mcdonaldFactory =  foodFactory.createMcdonaldFactory();
  mcdonaldFactory.makeFood();
 
  System.out.println();
 
  //产生一级工厂SoftFactory
  SoftFactory softFactory = abstractFactory.createSoftFactory();
  softFactory.createSoft();
  System.out.println(“=================================”);
  //产生二级工厂IBMFactory
  IBMFactory ibmFactory =  softFactory.createIBMFactory();
  ibmFactory.createSoft();
  //产生二级工厂SUNFactory
  SUNFactory sunFactory = softFactory.createSUNFactory();
  sunFactory.createSoft();
       
    }
}

//抽象工厂实现类,实现产生工厂的抽象方法
class AbstractFactorySupport extends AbstractFactory{
//长生食物工厂
    @Override
    public FoodFactory createFoodFactory() {
        return new FoodFactory();
    }
//产生软件公司
    @Override
    public SoftFactory createSoftFactory() {
        return new SoftFactory();
    }
   
}
//食物工厂
class FoodFactory {
 public void makeFood(){System.out.println(“food factory make food”);}
 public McdonaldFactory createMcdonaldFactory() {return new McdonaldFactory();}
 public KFCFactory createKFCFactory(){return new KFCFactory();}
}

//KFC工厂继承食物工厂,生产KFC食物

class KFCFactory extends FoodFactory {
 public void makeFood(){
  System.out.println(“we make KFC wing”);
 }
}

//Mcdonald工厂继承食物工厂,生产Mcdonald食物

class McdonaldFactory extends FoodFactory {
 public void makeFood(){
  System.out.println(“we make Mcdonald’s wing”);
 }
}

//软件公司开发软件

class SoftFactory {
 public void createSoft(){System.out.println(“soft factory create software”);}
 public SUNFactory createSUNFactory() {return new SUNFactory();}
 public IBMFactory createIBMFactory(){return new IBMFactory();}
}

//IBM公司继承软件工厂,开发软件(IBM软件)

class IBMFactory extends SoftFactory{
 public void createSoft(){
  System.out.println(“we create IBM software”);
 }
}

//SUN公司继承软件工厂,开发软件(开源软件)

class SUNFactory extends SoftFactory{
 public void createSoft(){
  System.out.println(“we create SUN software”);
 }
}

运行AbstractFactory 的main方法输出:

food factory make food
==============================
we make KFC wing
we make Mcdonald’s wing

soft factory create software
=================================
we create IBM software
we create SUN software
我们要加一个手机工厂就可以这样做
//手机生产商设计手机
class MobileFactory{
    public AppleFactory createAppleFactory(){return new AppleFactory();}
    public MeizuFactory createMeizuFactory(){return new MeizuFactory();}
    public Product designMobile(){System.out.println(“mobile factory design mobile”);}
}
//Apple公司设计手机(iPhone4)
class AppleFactory extends MobileFactory{
    public Product designMobile(){
        return new Product(“Apple iphone4″);
    }
}
//魅族公司设计手机(M9)
class MeizuFactory extends MobileFactory(){
    public Product designMobile(){
        return new Product(“Meizu M9″);
    }
}

而在抽象工厂类就添加
public abstract MobileFactory createMobileFactory();
—————————————————————————-抽象工厂模式完
嗯这个抽象工厂我做的不是很好,也是因为我的业务比较松散有关吧,我这里的工厂都是没有关联的FoodFactory,SoftFactory,MobileFactory
网上有例子,我觉得那个更好些。网址是http://zhidao.baidu.com/question/63058512.html,大家可以去看看。

最后呢给出一个综合的例子,加上之前的singleton单例模式,我们做一个JMS发送消息的demo吧。这里有点难懂了,嗯涉及到了EJB3.0中的知识了,不过不必深究了,知道整个程序的大致思路就可以啦。

class ContextHelper{

//这个类是一个单例模式,主要功能有两个1.loadJBOSSProperties(String filename)读取JBOSS的上下文环境配置2.得到上下文,那么我们就可以通过这个上下文从EJB容器中通过JNDI读取对象了Lookup(String ejb)。
        private static ContextHelper chelper = new ContextHelper();
        private ContextHelper(){};
        public static ContextHelper getInstance(){
            return chelper;
        }
        public Properties loadJBOSSProperties(String filename){
            Properties props = new Properties();
            props.load(new FileInputStream(filename));
            return props;
        }
        public Object lookup(String ejb){
            Context conx = new InitailContext(this.loadJBOSSProperties());
            return conx.lookup(ejb);
        }
    }
      
    //发送消息的接口
    interface MessageSender{
        public void sendMessage(Message message);
    }
    //发送一对一消息的实现
    class QueueMessageSender implements MessageSender{
        public void sendMessage(){
            QueueConnectionFctory qcf = (QueueConnectionFctory)ContextHelper.getInstance().lookup(“ConnectionFactory”);
            QueueConnection qconnection = qcf.getConnection();
            QueueSession qs = qconnection.getSession(false,TopicConnection.AUTO_ACKOWNLEDGE);
            Queue queue = (Queue)ContextHelper.getInstance().lookup(“Queue/myQueue”);

    Message message =(TextMessage) queue .createMessage(“我是一个消息”);
            QueueSender qsender = qs.createSender(queue);
            qsender.send(message);
            qs.close();
            qconnection.close();
        }
    }
    //发送一对多消息的实现
    class TopicMessageSender implements MessageSender{
        public void sendMessage(){
            TopicConnectionFctory tcf = (TopicConnectionFctory)ContextHelper.getInstance().lookup(“ConnectionFactory”);
            TopicConnection tconnection = tcf.getConnection();
            TopicSession ts = tconnection.getSession(false,TopicConnection.AUTO_ACKOWNLEDGE);
            Topic topic = (Topic)ContextHelper.getInstance().lookup(“Topic/myTopic”);
          Message message =(TextMessage) topic.createMessage(“我是一个主题”);

     TopicPublisher tp= ts.createPublisher(topic);
            tp.send(message);
            ts.close();
            tconnection.close();
        }
    }
    //消息发送的工厂类
    class MessageSenderFactory{
        public MessageSender createQueueMessageSender(){
            return new QueueMessageSender();
        }
       
        public MessageSender createTopicMessageSender(){
            return new TopicMessageSender();
        }
       
        public static void main(String[] args) {
            MessageSenderFactory msf = new MessageSenderFactory();
            msf.createQueueMessageSender().sendMessage();//我们就发送消息
            msf.createTopicMessageSender().sendMessage();//我们就发送主题
        }
    }

有朋友说文章不是很容易看懂,特别是抽象工厂模式。嗯,我觉得也是,今天有空就再看看,增加了更多的注释,文章机构画一下。有什么意见可以提,不同意见可以排版,还有不明白的可以交流。Skeype:linmei.dong、MSN:donglinmei@hotmail.com(文/linmei.dong)转载请注明出处http://mtoou.info/java-factory-gcmoshi/

嗯,java设计模式系列之factory工厂模式就写到这里啦,下期是java设计模式系列之Builder构建模式,敬请持续关注~

Java设计模式之singleton单例设计模式

现在网上到处是单例设计模式,都开玩笑说现在满城尽是singleton,呵呵,我也拿出来了,因为我平时用到最多的就是单例设计模式吧,而且比较简单,可以作为Java设计模式的入门篇吧。

SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个 人,那就是我(刚才做了个梦啦,哪有这么好的事)

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的 “单一实例”的需求时才可使用。’‘————————–先引用下“从追MM谈Java的23种设计模式”文章中的说法。

单例设计模式形式有4种,一般人只知道有两种,懒汉式和饿汉式。
懒汉式(只有需要的时候才new出来,这里要用synchronized方法或代码块同步,因为在多线程情况下,不同的人同时进来拿到的引用可能都是null,结果都去new了)
public class LazzSingleton{
private LazzSingleton lazzSingleton = null;
 private LazzSingleton() {}//私有构造期 这个很重要啦,如果共有那么外面就可以随便new了,那么我们写这个单例意义就不大了,我发现公司老员工都写public的了,大家要注意下!

public synchronized LazzSingleton getInstance(){
 if(lazzSingleton==null){
   lazzSingleton = new LazzSingleton ();
return lazzSingleton ;
}
return null;
}

}

用的时候就:LazzSingleton lazzSingleton = LazzSingleton.getInstance();

饿汉式(一来就new,拿的时候直接拿对象)
public class HungerSingleton{
private HungerSingleton hungerSingleton = new HungerSingleton ();
private HungerSingleton() {}//私有构造期
public HungerSingleton getInstance(){
return hungerSingleton ;
}
}

用的时候就:HungerSingleton singleton = HungerSingleton.getInstance();

还有一种和饿汉式差不多(Effective Java这本书中有),因为式静态常量,当然内存中只有一个对象啦。
public class StaticFinalSingleton(){
public static final StaticFinalSingleton singleton= new StaticFinalSingleton();

private StaticFinalSingleton (){};//私有构造期
}

用的时候就:StaticFinalSingleton staticFinalSingleton = StaticFinalSingleton.staticFinalSingleton ;

最后一种我记不起来了,用的不多。(我有个坏习惯,嗯,比喜欢记笔记,而且记性不好,希望大家不要学我)

所以实现单例要点:1.私有化构造器(外部不能new),2.用对象名去引用属性(第三种)或静态方法(第一第二种);

应用场景(单例设计模式一般和工厂设计模式联合起来用,等做factory工厂模式时再一起使用,很简单)
如果你的系统中有要读配置文件,那么读配置文件的类就可以用单例设计模式了。例子:
public class LoadProperties {
 private static LoadProperties loadProperties = new LoadProperties();
 private LoadProperties(){};
 
 public static LoadPropertiesgetInstance(){
  return loadProperties
 }
 /**
  * 根据文件名、模块名,从配置文件中取得菜单名
  * @param model
  * @param fileName
  * @return
  */
 public String[] getMenus(String model,String fileName){
  //….
  return null;
 }
 /**
  * 根据文件名,读取显示风格
  * @param fileName
  * @return
  */
 public String[] getStyle(String fileName){
  //……
  return null;
 }

 }
 /**
  * 根据文件名,用户名,读取用户权限,<p>先判断用户级别,然后读取其权限</p>
  * @param fileName
  * @param user
  */

public String[] getPrivileges(String filename,String username){

    return null;

}

//……
}

接下来我们来做个实验,检验到底是不是singleton单例,单线程下我们一眼就看的出来是,所以我们就在多线程下测试。
package org.javaer.code.pattern;

public class Singleton {
 static LazzSingleton lazzSingleton1, lazzSingleton2;
 static HungerSingleton hungerSingleton1, hungerSingleton2;
 static StaticFinalSingleton staticFinalSingleton1, staticFinalSingleton2;

 public static void main(String[] args) {

  while (1 > 0) {
   new Runnable() {
    public void run() {
     lazzSingleton1 = LazzSingleton.getInstance();
     hungerSingleton1 = HungerSingleton.getInstance();
     staticFinalSingleton1 = StaticFinalSingleton.staticFinalSingleton;
    }
   }.run();

   new Runnable() {
    public void run() {
     lazzSingleton2 = LazzSingleton.getInstance();
     hungerSingleton2 = HungerSingleton.getInstance();
     staticFinalSingleton2 = StaticFinalSingleton.staticFinalSingleton;
    }
   }.run();
   System.out.println(lazzSingleton1 == lazzSingleton2 ? “是单例”
     : “不是单例”);
   System.out.println(hungerSingleton1 == hungerSingleton2 ? “是单例”
     : “不是单例”);
   System.out
     .println(staticFinalSingleton1 == staticFinalSingleton2 ? “是单例”
       : “不是单例”);
  }
 }
}

class LazzSingleton {
 private static LazzSingleton lazzSingleton = null;
 private LazzSingleton() {}
 public synchronized static LazzSingleton getInstance() {
  if (lazzSingleton == null) {
   lazzSingleton = new LazzSingleton();//需要的时候new出来
   return lazzSingleton;
  }
  return null;
 }

}

用的时候就:LazzSingleton lazzSingleton = LazzSingleton.getInstance();

class HungerSingleton {
 private static HungerSingleton hungerSingleton = new HungerSingleton();//先new出来
 private HungerSingleton() {}
 public static HungerSingleton getInstance() {
  return hungerSingleton;
 }
}

用的时候就:HungerSingleton singleton = HungerSingleton.getInstance();

class StaticFinalSingleton {
 public static final StaticFinalSingleton staticFinalSingleton = new StaticFinalSingleton();

private StaticFinalSingleton (){};
}

我们比较的是他们的内存地址,显示的结果一直是”是单例”,说明我们写的代码都是正确的单例设计模式。我这里人品比较好啊,用的Thread 和 Runnable实现多线程测试结果都一样,
我之前做过测试发现只有是Rnnable实现的多线程始终是”是单例”,而用Thread实现的多线程有的情况是,有的情况不是。我不是很清楚,貌似这是Rnnable 和Thread实现多线程有区别吧。
我弄了很久也不是很清楚,得看类的源码了,我们就不用关心啦,感兴趣的盆友就去研究下。

总结下:如果你的系统中需要的对象只有一个(为了节约内存,内存对于程序来说是非常重要的,尤其是嵌入式开发。不要以为你的内存大,用户访问多了,服务器的几十的G的内存也受不了,性能下降),如读取配置信息的类(多了去),不同的模块访问的公共类等等;那么就可以用单例设计模式了。Servlet的设计就是单例的,所有的用户拿到的都是服务器上的一个实例对象。(文/linmei.dong)转载请注明出处http://mtoou.info/java-singleton/

四个Java编程小技巧

看到了不少观众的支持,我的信心更足了,决定继续写下去。由于第一期的Java面向对象观众反应代码过多,表达不够清楚,思路有点乱,而且有错别字(好吧,我承认我的外语水平不好^_^)呵呵,谢谢大家的意见,所以本来是要写Java设计模式系列,我临时做了下调整,这期就写Java编程小技巧吧。

(1)你的判断两个数的奇偶性你用的方法合适吗
     if(num%2!=0) 奇数 else 偶数
     大家都知道这个方法,其实还有更快的小方法,可能有些人就不知道了
     if(num & 1 ==1) 奇数else 偶数,用的屎位运算,肯定要快些啦。
(2)两个数的互换,大家都可能会用
     type temp;
     temp = x;
     x = y;
     y = temp;
     也有不用临时变量的方法
        x = x+y;    
        y = x-y;   
        x = x-y;
          或
        x = x^y;
        y = y^x;
        x = x^y;同样可以实现两个两个数交换,说有什么技术含量还真没什么,就是面试可能会考到。
(3)LINUX里面的权限判断,也可以借鉴,这里也是用位运算
     int read = 1<<0;
     int write = 1<<1;
     int execute = 1<<2;
    定义用户操作一个文件的权限为read | execute(权限值为5);linux里面文件的权限是三位数如777(系统任何人都有可读,可写,可执行的权限),可以用ls -l命名查看,因为linux里面的权限有组的概念,和windows的组策略差不多。
    那么用户操作该文件的权限就可以算出来了 (read | execute) & read>=1?可读:不可读; 以此类推…
(4)字符串处理最好用正则表达式,和编译原理的神马自动机理论有关,处理速度也是非常快,在linux下大量使用如Grep命令,例子查找文件Hello.java文件里面是否有main关键字,
就可以用 find -name home\Hello.java | grep *\s+main\s+* |more
    我们要处理根据xml旳节点的命名标准来判断字符串,XML节点命名标准如下:
 1.第一个字符必须位字符
 2.中间必须位数字和字符或.-_
 3.最后必须位数字或字符或空格或.-_
    我们就用JAVA的regex来处理,非常方便,正则表达是为:
    String regex = “^[[a-zA-Z]|[\u2E80-\u9FFF]]+[[a-zA-Z]|[0-9]|[\u2E80-\u9FFF]|[.|\\-|_]]+\\s*”; (不要看这么长,实际上是非常简单的,看看Java API就知道怎么写了)
     public class RegexTest{
 @org.junit.Test
 public void regexTest(){
  String regex = “^[[a-zA-Z]|[\u2E80-\u9FFF]]+[[a-zA-Z]|[0-9]|[\u2E80-\u9FFF]|[.|\\-|_]]+\\s*”;
  String input = “w你w好.-.553.你-.__.-.   “;
  java.util.regex.Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(input);
  while(!matcher.matches()){
   System.out.println(“匹配失败”);
   break;
  }
  System.out.println(“匹配成功”);
  //也可以用这种方式判断
  /*
        boolean isMacher = Pattern.matches(regex,input );
  System.out.println(isMacher?”匹配”:”不匹配”);
  */
 }
    }
xml文件节点<w你w好.-.553.你-.__.-.   />用上面的正则表达式来判断是没有问题的。
小技巧也就是平时编程的经验积累吧,所以呢我还是提倡多写代码,多思考。
一时半伙儿也想不到很多的小技巧,就写这么多了。如果你还不知道,就赶快学一下吧。如果你还有神马小技巧,赶快和大家分享!!
我的Email:donglinmei@hotmail.com 964318731@qq.com、Mobile Phone :(+86)182 5196 5264、qq :964318731 转载请注明出处http://mtoou.info/java-bcjqiao/