几种常见的设计模式(单例,简单工厂模式)
- 创建型模式:工厂、抽象工厂、单例;
工厂模式:复杂的对象的话可以用工厂,建立一个工厂类,用来决定具体要实例化哪个对象,主要解决的是接口的选择问题,用在明确知道不同实例化下的具体条件。
优点:想要创建对象,只要知道名字就好了,不用去知道具体这个对象的具体实现;要增加一个产品,只要扩展这个工厂类就好了;
缺点:每次增加产品就要增加一个具体的产品类,增加了系统复杂度
下图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