一:设计模式
所谓模式:就是一套问题的解决方案
套路
招术
二:设计分类:
宏观两大类
JAVA设计模式:23种
又可以分为:
创建型:比如单例,工厂
结构型
行为型
J2EE设计模式:
比如MVC模式,前端控制器,业务委派等等
三:单例模式:
作用:保证我们的类的实例只有一个,也就是有一些类,不需要被多次new,一个就够了,常见的比如,读取文件的类,类似于这样的情况,就不需要该类被创建多次,也就是new一次就够了
单例分类:
饿汉式
懒汉式
两种类型代表了不同的创建风格
使用步骤:
1.首先自己先创建一个类的实例
2.为了让这个实例只是被创建一次,用static来修饰一下
3.为了不让客户端直接来访问该对象,你可以使用private控制访问
4.提供一个方法来访问这个全局的staitc类型的实例
public FileReader getInstance(){
return filereader;
}
5.要访问该方法,也必须先创建该类,然后才能访问,为了避免这种创建,可以使用static类修饰,然后就可以使用:
类名.方法
来调用
该方法被称为"单例方法"
6.有了这个单例的方法,就不需要客户端来new这个类了,所以,你可以将构造器变为私有,这就强制要求客户端必须通过单例方法来获取该类的唯一的实例
private static FileReader filereader = new FileReader();
public static FileReader getInstance(){
return filereader;
}
private FileReader(){
}
这种写法被称为"饿汉式单例"
7.等着看效果
在人员管理界面中:
FileReader fr1 = FileReader.getInstance();
fr1.setFilename("我的过滤文件");
out.println(fr1.getFilename());
在这里,fr1指的就是在FileReader类中被创建出来的那个对象
在部门管理界面中:
FileReader fr2 = FileReader.getInstance();
out.println(fr2.getFilename());
这里的fr2指向的也是FileReader类那个被唯一创建出来的实例
也就是说,fr1和fr2指的是同一个实例
所以,当在staff.
在department.
"我的过滤文件".
因为它们指的是同一个"实例"
8.懒汉式单例:
private static PropertiesMgr pm = null;
private PropertiesMgr(){
System.out.println("propertiesmgr被构造...");
}
public static PropertiesMgr getInstance(){
if(pm==null){
pm = new PropertiesMgr();
}
return pm;
}
在声明pm对象的时候,并没有马上创建PropertiesMgr 的对象
而只有当调用getInstance方法的时候才被创建出实例来
而这一点和饿汉式的单例不太一样,
对于饿汉式单例而言,至于该类被访问,马上就new出新的实例来
比较一下区别:
饿汉式是直接就创建一个实例出来
而懒汉式创建的步骤延迟了一步,只有当getInstance方法被调用的时候,才创建
四:工厂模式:
很多时候,我们要得到一个实例,往往不是直接new这么简单,从系统扩展性考虑,一个接口有多个实现类,我们往往需要动态的决定创建某个类的实例,如果在代码中写死,也就是说你的程序的可维护性和扩展性被大大降低
1.找到
2.改动代码
3.打包
4.发布
可维护性就有保障了
方法之一:
把这些可变的东西,从代码中抽取出来,在我们的例子中,我们把这些信息提取到properties配置文件中,当我们需要改动的时候,我们就可以覆盖配置文件即可
现在,我们需要建立一个工厂,只让它做一件事情,用来生产斧头,对于客户端而言(客户端一定是多个)就无须干涉这"斧头"是如何创建出来的
如何来建立一个工厂
1.我们有一个市场部,专门用来收集订单,在本系统中,config.properties就是用来收集"你到底想要哪把斧头"
classname=com.sun.demo.Fruit
2.你需要拿到客户预订的需求
String strName = p.getProperty("classname");
3.创建该对象(我们的这个对象就是com.sun.demo.Fruit)
在本例中,我们所编写的FruitFactory,因为承担了生产实例的职责,我们把它称为"工厂类"
招术=======工厂模式
工厂模式的衍生:简单工厂:抽象工厂。工厂方法