zoukankan      html  css  js  c++  java
  • 设计模式

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

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

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

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

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

    下图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

  • 相关阅读:
    mysql 查询当天、本周,本月,上一个月的数据
    Mysql 查看连接数,状态 最大并发数,以及设置连接数
    MySQL慢查询日志优化
    java中线程通信(传统的线程通信)
    java中死锁
    同步锁(lock)
    同步锁(lock)
    释放同步监视器的锁定(java疯狂讲义)
    linux第9天 UDP
    linux第8天 connect强化
  • 原文地址:https://www.cnblogs.com/zhang-qc/p/9430842.html
Copyright © 2011-2022 走看看