请写出您熟悉的几种设计模式,并做简单介绍。
答:工厂设计模式:程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象。
代理设计模式:指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与上网相关的其他操作(相关业务)
适配器模式:如果一个类要实现一个具有很多抽象方法的接口,但是本身只需要实现接口中的部分方法便可以达成目的,所以此时就需要一个中间的过渡类,但此过渡类又不希望直接使用,所以将此类定义为抽象类最为合适,再让以后的子类直接继承该抽象类便可选择性的覆写所需要的方法,而此抽象类便是适配器类。
写出你用过的设计模式,并至少写出2种模式的类图或关键代码。
工厂设计模式:
思路说明:由一个工厂类根据传入的参数(一般是字符串参数),动态决定应该创建哪一个产品子类(这些产品子类继承自同一个父类或接口)的实例,并以父类形式返回
优点:客户端不负责对象的创建,而是由专门的工厂类完成;客户端只负责对象的调用,实现了创建和调用的分离,降低了客户端代码的难度;
缺点:如果增加和减少产品子类,需要修改简单工厂类,违背了开闭原则;如果产品子类过多,会导致工厂类非常的庞大,违反了高内聚原则,不利于后期维护。
public class SimpleFactory {
public static Product createProduct(String pname){
Product product=null;
if("p1".equals(pname)){
product = new Product1();
}else if("p2".equals(pname)){
product = new Product2();
}else if("pn".equals(pname)){
product = new ProductN();
}
return product;
}
}
单例模式
/**
* 饿汉式的单例模式
* 在类加载的时候创建单例实例,而不是等到第一次请求实例的时候的时候创建
* 1、私有 的无参数构造方法Singleton(),避免外部创建实例
* 2、私有静态属性instance
* 3、公有静态方法getInstance()
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){ }
public static Singleton getInstance(){
return instance;
}
}
/**
* 懒汉式的单例模式
*在类加载的时候不创建单例实例,只有在第一次请求实例的时候的时候创建
*/
public class Singleton {
private static Singleton instance;
private Singleton(){ }
/**
* 多线程情况的单例模式,避免创建多个对象
*/
public static Singleton getInstance(){
if(instance ==null){//避免每次加锁,只有第一次没有创建对象时才加锁
synchronized(Singleton.class){//加锁,只允许一个线程进入
if(instance==null){ //只创建一次对象
instance = new Singleton();
}
}
}
return instance;
}}
可以点击此链接添加备注暗号进行免费领取
列出除Singleton外的常用的3种设计模式,并简单描述
答:工厂模式:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
适配器模式:适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
模板模式:在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
Action是单实例还是多实例,为什么?
答:struts2中action是多例的,即一个session产生一个action
背景:
1) Struts2会对每一个请求,产生一个Action的实例来处理.
2) Spring的Ioc容器管理的bean默认是单实例的.
首先从数据安全性的问题上考虑,我们的Action应该保证是多例的,这样才不会出现数据问题。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一个来提高性能,这样的话,就可以使用单例模式。
不过幸好,Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。如果用单例,就在spring的action bean配置的时候设置scope=”prototype”