设计模式面试题
设计模式
概念
设计模式:针对某一问题的最佳解决方案。是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
一般认为有23中设计模式:
创建型模式(提供对象的创建)
工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构型模式(关注类和对象的组合,扩展功能)
适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式、 代理模式
行为型模式(关注对象之间的通信)
责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式
J2EE 模式(关注表示层,由 Sun Java Center 鉴定的):
MVC 模式,业务代表模式,组合实体模式,数据访问对象模式,前端控制器模式,拦截过滤器模式,服务定位器模式,传输对象模式
常用的设计模式有哪些:
单例设计模式,代理设计模式,工厂设计模式,
单例设计模式
保证一个类在内存中的对象唯一性。在整个软件运行期间,针对某一个类只存在一个实例
单例设计模式分为饿汉式和懒汉式
饿汉式
class Single{
private Single(){} //私有化构造方法。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
懒汉式
public class Single{
private Single(){} //私有化构造方法。
private static Single s = null;
public static synchronized Single getInstance(){
if(s==null){
s = new Singleton();
}
return s;
}
}
为了效率问题,通过双重判断的形式解决。
class Single{
private Single(){} //私有化构造方法。
private static Single s = null;
public static Single getInstance(){ //锁是谁?字节码文件对象;
if(s == null){
synchronized(Single.class){
if(s == null)
s = new Single();
}
}
return s;
}
}
饿汉式和懒汉式的区别
懒汉式是延时加载,他在类调用获得实例方法时创建实例,而饿汉式在类加载时候就会创建。
饿汉式是线程安全的,在类创建的同时就创建好一个静态的对象供系统使用,以后不在改变
不加synchronized懒汉是不安全的,如不加上synchronized则会导致对对象的访问不是线程安全的,多线程访问时会创建多个实例,加上又会影响效率,可以用双重判断形式解决
推荐使用饿汉式,
内部类方式:
|
public class Single { private static class LazyLoader{ private static final Single instance = new Single (); } private Single(){} public static Single getInstance(){ return LazyLoader.instance; } } |
模板方法设计模式
定义一个抽象类作为模板,将具体做事情方法定义出来,但是不实现,即定义为抽象方法
对外提供一个共有的方法作为接口,规定做事情的顺序,此方法为模板方法,应声明为final,禁止子类重写即此方法中把各种要实现的方法按一定的顺序排列好
子类继承模板,实现所有的抽象方法(需要具体做的事情)
如定义一个模板
public abstract class Beverage {
/**
* 冲泡咖啡或茶...流程
*/
public final void create(){
boilWater();//把水煮沸
brew();//用沸水冲泡...
pourInCup();//把...倒进杯子
addCoundiments();//加...
}
public abstract void addCoundiments();
public abstract void brew();
public void boilWater() { System.out.println("煮开水"); }
public void pourInCup() { System.out.println("倒进杯子"); }
}
这之后用冲咖啡或冲茶的类进行继承并实现其中的未实现的方法,就可以了,主类中调用相应对象creat方法就完成了。
工厂设计模式
用于对象的创建
定义对象的共有方法及要实现的抽象方法

要被生产的对象实现其中的抽象方法

抽象工厂定义产品对象的产生

这里用的是泛型,传入的对象必须是Product抽象类的实现类。具体如何产生一个产品的对象,是由具体工厂类实现的,具体工厂类继承这个抽象工厂类:

生产对象测试


浙公网安备 33010602011771号