设计模式:
通过很多东西抽取出来的一个模型。
创建型:创建对象。工厂模式,单例模式。
结构型:对象间的关系。装饰模式。
行为型:对象能够做什么。模板模式。
GOF设计模式。(23种。)
闫闳(国内研究设计模式比较早)
论坛:CSDN,ITeye,J道,www.infoq.com
工厂模式:
比如说,我们现在有很多动物类,猫,狗,猪...
而这些动物有相同的行为,eat()。
抽取一个共同的父类。动物。
简单工厂模式:
Animal
|--Dog
|--Cat
AnimalFactory
public static Animal createAnimal(String type){
if("dog".equals(type)){
return new Dog();
}else if("cat".equals(type)){
return new Cat();
}else {
return null;
}
}
工厂方法模式:
Animal
|--Dog
|--Cat
|--Pig
AnimalFactory
|--DogFactory
|--CatFactory
|--PigFactory
单例模式:
就是指类在内存中只能有一个对象。
举例:windows的打印服务,网站计数器
应用:线程池,数据库连接池
面试题:请写出一个单例设计模式。
分析:
类在内存中只能有一个对象。
A:外界不能够随意创建对象。
把构造方法私有
B:类本身要创建一个对象。
C:通过公共的方式提供给别人。
单例模式分类:
饿汉式:类加载就创建对象(开发用)
懒汉式:什么时候用,就什么时候创建。(面试用)
为什么?
A:延迟加载。
B:线程安全问题。怎么解决呢?
装饰模式:对类原有的功能进行了修饰或者扩充。
我们都有手机,手机具备打电话的功能。
按照正常做法,我们应该把手机类给设计出来,并给出一个打电话功能。Phone.java
随着发展,人的需求也是在变化的,假设我现在需要在打电话前听到彩铃,而这种需求是部分人需要的,那么,现在我们该怎么办呢?
回想我们曾经学过继承,通过继承就可以具备父亲的打电话功能,我还可以在新的手机上添加彩铃功能。ColorPhone.java
继续发展,人的需求又发生改变了,我想在打完电话后,可以播放广告。GuangGaoPhone.java
需求继续改变,我想要先有彩铃,接着打电话,最后放广告。
A:继承ColorPhone
B:继承Phone,然后自己实现彩铃,父亲的打电话,自己实现广告
需求还是可以继续发生改变的,使用继承可以解决问题,但是,将来一旦某个父亲发生了改变,依赖这个父亲的子类都会发生改变。
所以,这种解决方案可以,但是不好。
Phone
|--ColorPhone
|--ColorGuangGaoPhone
|--...
|--GuangGaoPhone
|--...
既然不好,那么, 在开发的过程中,就会有相应的东西来替代它。
这种东西就叫:设计模式。
而我们讲解的这种模式:装饰设计模式。
A:被装饰的抽象事物 Phone
B:具体的事物 PhoneImpl
实现Phone接口,具体实现类
C:装饰类 PhoneDecorate
实现Phone接口,调用实现。
private Phone phone;
public PhoneDecorate(Phone phone) {
this.phone = phone;
}
@Override
public void call() {
this.phone.call(); // 具体的手机打电话功能
}
要有彩铃:
具有彩铃功能的装饰类
要有广告:
具有广告功能的装饰类
要有先彩铃,接着电话,最后广告功能。
...
Phone(接口)
|--PhoneImpl(具体实现类)
|--PhoneDecorate(抽象类)
|--ColorPhoneDecorate(具体装饰类)
|--GuangGaoPhoneDecorate(具体装饰类)
模板模式:
我需要打印一篇文章,这篇文章:
头,中间,尾组成。
Print
print(){
printHead();
printBody();
printBottom();
}
printHead(){}
printBody(){}
printBottom(){}
这样做的话,我们就得把打印操作给固定了,固定后如果有新的变化,发现不好。
怎么办呢?我们就采用一种设计模式解决:模板模式。
模板类:(抽象类)
打印模板类:
打印方法:具体的。
三个抽象方法。
具体实现类1:
具体实现类2:
|
|