设计模式

 几种常见的设计模式(单例,简单工厂模式)

  • 创建型模式:工厂、抽象工厂、单例;

工厂模式:复杂的对象的话可以用工厂,建立一个工厂类,用来决定具体要实例化哪个对象,主要解决的是接口的选择问题,用在明确知道不同实例化下的具体条件。

优点:想要创建对象,只要知道名字就好了,不用去知道具体这个对象的具体实现;要增加一个产品,只要扩展这个工厂类就好了;

缺点:每次增加产品就要增加一个具体的产品类,增加了系统复杂度

下图shapefactory是工厂类,有三个产品类。这里返回的其实是shape对象,用到了多态

public class ShapeFactory {
    
   //使用 getShape 方法获取形状类型的对象
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

  

抽象工厂:和工厂类似,但是可能有多个产品族,所以设置了多个工厂类,继承与同一个抽象工厂类。用户知道产品的名字后,先按照产品族去获取一个工厂类对象,当然返回的是抽象个工厂,然后再用抽象工厂中的getshape或者getcolor函数获取到具体的产品

优点:能保证client只能使用一个产品族的对象;缺点:产品族的扩展很困难

总的来说:简单工厂就是专门定义一个工厂类负责创建其他类的实例;工厂就是定义一个创建接口,然后让子类决定实例化哪个类;抽象工厂就是产品族时,就提供一个接口,其实和工厂类似

 

单例:当想控制实例的数目时候,节省系统资源,不想一个全局使用的类频繁创建和销毁。关键是构造函数是私有的

优点:只有一个实例,开销低,避免资源的多重占用(比如写文件操作)

缺点:没有接口,不能继承,一个类应该只关心内部的逻辑,而不关心外面怎么样来实例化

public class SingleObject {
 
   //创建 SingleObject 的一个对象
   private static SingleObject instance = new SingleObject();
 
   //让构造函数为 private,这样该类就不会被实例化
   private SingleObject(){}
 
   //获取唯一可用的对象
   public static SingleObject getInstance(){
      return instance;
   }
 
   public void showMessage(){
      System.out.println("Hello World!");
   }
}

  实现方式:懒汉(第一次用才创建实例),饿汉(类加载时就初始化)

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

  如上,必须加锁才能保证单例,但是加锁影响效率

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

  如上是饿汉的方式,避免了加锁,这种方式比较常用,但是类加载就初始化,浪费了内存。

  一般不适用懒汉,而是饿汉,如果明确要求实现lazy loading效果,可以使用登记式方式。如果涉及反序列化创建对象,可以使用枚举的方式。

 

结构性模式:桥接、代理;(桥接:抽象和实现分离)

行为型模式:观察者、命令、策略;

J2EE模式:MVC设计模式(模型-视图-控制器,用于应用程序的分层开发)

模型:一个存取数据的对象或者java pojo;

视图:代表模型包含的数据的可视化;

控制器:作用于模型和视图上,用于控制数据流向模型对象,更新视图。它使模型和视图分离

 

例如:

 

 

参考:http://www.runoob.com/design-pattern/mvc-pattern.html

 

posted @ 2018-08-06 16:11  qczhang  阅读(322)  评论(0编辑  收藏  举报