学习一个设计模式,至少应该明白,这种设计模式要解决什么问题,什么时候可以使用,他是如何解决问题的,要记住关键代码,还有优缺点是什么。
创建型模式顾名思义,就是用来创建对象的。有时候为了保证创建的对象唯一,或者创建的高效等等,就需要用到这些设计模式。
单例模式就是保证创建的对象是唯一的,实现方式并不唯一,下面会考虑多线程环境下的实现。
然后单例模式有三个要点:
下面是非多线程情况下的单例模式(最简单的实现方式)——任务管理器的实现
class taskmanager{ private static taskmanager tm = null; private taskmanager(){...} public void displayprocesses(){...} public void displayservice(){...} public static taskmanager getinstance(){ if(tm == null){ tm = new taskmanager(); } retrun tm; } }
上述代码中,tm实例和初始化方法无法被外界访问(也就是不能被new),外界只能通过调用getinstance方法去获取这个类的实例,那么为什么实例必须是static的呢?(tm)
下面我们考虑多线程情况下的单例模式,饿汉单例模式和懒汉单例模式。
饿汉单例模式能保证在多线程情况下的对象唯一性,那他是怎么实现的呢?
最关键的一点,是他在类加载的时候就创建好了对象,这样就保证对象已经存在。
class eagersingleton{ private static finale eagersingleton = new eagersingleton(); private eagersingleton(){} public static eagersingleton getinstance(){ return instance; } }
懒汉单例模式用到了一种技术叫做延迟加载技术(lazy load),即类加载时并不自行实例化,需要的时候再加载实例,为了避免多个线程同时调用getinstance(),可以使用关键字synchronized,另外可以通过对代码块进行同步,而不是对这个getinstance方法同步来优化。
首先要说明的是,工厂方法模式是最常用的创建模式,简单工厂模式是工厂方法模式的基础。直接放代码:
package createpartten; /** * created by lettino on 2018/11/12 */ interface chart { public void display(); } class histogramchart implements chart { public histogramchart() { system.out.println("创建柱状图"); } public void display() { system.out.println("创建柱状图"); } } class piechart implements chart { public piechart() { system.out.println("创建饼图"); } public void display() { system.out.println("创建饼图"); } } class linechart implements chart { public linechart() { system.out.println("创建折线图"); } public void display() { system.out.println("创建折线图"); } } public class chartfactory { public static chart getchart(string type) { chart chart = null; if (type.equalsignorecase("histogram")) { chart = new histogramchart(); system.out.println("初始化设置柱状图"); } else if (type.equalsignorecase("pie")) { chart = new piechart(); system.out.println("初始化设置饼图"); } else if (type.equalsignorecase("line")) { chart = new linechart(); system.out.println("初始化设置折线图"); } return chart; } }
简单工厂使用了静态工厂方法,造成工厂角色无法形成继承的等级结构。
客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
工厂方法模式中包含四个角色:
concretefactory(具体工厂) 他是具体工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户端,返回一个具体产品类的实例。
与简单工厂模式相比,工厂方法模式最重要的区别是引入了抽象工厂角色,抽象工厂可以是接口,也可以是抽象类或者具体类。
如对本文有疑问, 点击进行留言回复!!
网友评论