您的位置:首页 > 职场人生

设计模式心得小结(一)

2015-10-09 22:07 453 查看
</pre><p></p><p style="margin-top:0px; margin-bottom:22px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:'Microsoft Yahei',Simsun; font-size:17px; line-height:28px">最近在复习设计模式,这里写下一些自己在复习过程中的一些心得体会与大家交流</p><p style="margin-top:0px; margin-bottom:22px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:'Microsoft Yahei',Simsun; font-size:17px; line-height:28px">1、单例模式</p><p style="margin-top:0px; margin-bottom:22px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:'Microsoft Yahei',Simsun; font-size:17px; line-height:28px">​       单例模式是最简单的一种设计模式,其本质的特点是一个类里只实例化一个对象。在我们使用的Windows系统的电脑中,很多地方也采用了单例模式。举两个例子:我们在使用系统的回收站时只能打开一个,如果你在打开了一个回收站进程的前提下再次双击桌面上的回收站图标试图打开另外一个回收站进程,弹出的界面还是原来那个回收站的界面;另外一个例子是我们的资源管理器,在使用资源管理器时,同样也会出现回收站出现的情况。这就像我们很多玩游戏的同学,他们很多人喜欢打开同一款游戏的多个登录界面,试图多开作弊,而这种情况是游戏厂家所不能容许的,很多网络端游会弹出一个提示框告诉你游戏已经在运行之中,提示你不能打开第二个游戏登录界面了。</p><p style="margin-top:0px; margin-bottom:22px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:'Microsoft Yahei',Simsun; font-size:17px; line-height:28px">      回到正题里,Java中有很多单例的写法,这里简单谈一谈最主要的两种单例模式的写法:懒汉模式和饿汉模式。</p><p style="margin-top:0px; margin-bottom:22px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:'Microsoft Yahei',Simsun; font-size:17px; line-height:28px">      懒汉模式​与饿汉模式从名字上即可看到他们的区别,前者实例化对象的时间要晚与后者,废话不多说,先上代码:</p><p style="margin-top:0px; margin-bottom:22px; padding-top:0px; padding-bottom:0px; color:rgb(51,51,51); font-family:'Microsoft Yahei',Simsun; font-size:17px; line-height:28px"></p><pre name="code" class="java">//懒汉模式
public class Singleton{
private Singleton singleton = null;
private Singleton(){}//私有化构造方法
public sychronized static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
以上就是一个最简单的懒汉模式的代码,可以看到在创建了对象之后并没有马上进行实例化。

下面看一个饿汉模式的代码

//饿汉模式
public class Singleton{
private Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
饿汉模式与懒汉模式最主要的区别就在于在创建对象之后马上对对象进行实例化,这就是两者最为重要的区别。而细心的朋友可以看到在写懒汉模式的时候静态方法之前使用了一个同步块,其主要的原因是如果同时调用两次getInstance()方法的话可能会导致一个对象多次被实例化,因而是线程不安全的,所以在使用懒汉模式的时候一定要加上同步块。

好了,看完这两种写法肯定有人会疑问,这两种写法上的区别有本质的不同吗?当然是有的,由于私有化了构造方法,只提供一个公开的方法来实例化对象,懒汉模式是在需要的时候才对对象进行实例化,节省了开销,但时间效率上有所损失,而饿汉模式一开始就实例化好了对象,时间效率上占有优势,但这样会增加一些开销。换句话说,前者是以时间换空间,而后者是以空间换时间,到具体使用上就要依情况而定了。

单例模式除了这两种最为主要的写法之外,还有双重检测锁、枚举、静态内部类等写法,这里就不一一进行说明了。

2、简单工厂模式

简单工厂模式也是设计模式中最简单的一种,是工厂模式的一个分支。名字虽然叫做简单工厂,但其功能非常的强大,是一种将实例化对象与客户端分离的重要手段,深刻反映了面向接口编程的思想。

这里以生产汽车作为例子,作为营销采购部门,只需要向汽车工厂提供自己需要采购汽车的种类就行了(当然还要支付金钱),用这个例子来理解简单工厂模式再好不过了。

//定义一个汽车的接口
public interface Car{
public void getName();
}
//定义一个实现汽车接口的奔驰车类
public class Benz implements Car{
public void getName(){
System.out.println("生产的是一辆奔驰车");
}
}
//定义一个实现汽车接口的宝马车类
public class BMW implements Car{
public void getName(){
System.out.println("生产的是一辆宝马车");
}
}
//定义一个汽车工厂类,在这个工厂类中根据条件实例化返回需要的汽车类型
public class CarFactory{
public static int BMW_CAR = 1;
public static int BENZ_CAR = 2;
public static Car createCar(int type){
if(type==BMW_CAR){
return new BMW();
}else if(type==BENZ_CAR){
return new Benz();
}
}
}
//在main函数中使用简单工厂类
Car car = CarFactory.createCar(CarFactory.BMW_CAR);
car.getName();

简单工厂的优点:1、良好的解耦,客户端根本不需要知道是怎么实现的;2、实现了良好的封装,满足了面向接口编程的要求

同时简单工厂还有一些缺点,如可能增加客户端的复杂程度,不利于之类工厂的扩展。

使用简单工厂需要注意一些场景,如需要将客户端与生产对象的具体方式进行隔离。而使用简单工厂可以控制需要
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息