设计模式面试题

设计模式

概念

设计模式:针对某一问题的最佳解决方案。是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

 

一般认为有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抽象类的实现类。具体如何产生一个产品的对象,是由具体工厂类实现的,具体工厂类继承这个抽象工厂类:

生产对象测试

posted @ 2023-02-02 10:28  星光闪闪  阅读(53)  评论(0)    收藏  举报