------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
设计模式:
经验的总结。
A:创建型 创建对象
B:结构型 对象的组成
C:行为型 对象的功能
创建型模式:
1:简单工厂模式
提供抽象类(动物),让具体类(猫、狗)去继承抽象类,并重写抽象方法实现特有功能。
提供工厂类,通过该类根据传递的参数去造具体类的对象。
2:工厂方法模式
提供抽象类(动物)和工厂接口(抽象方法),当需要创建特定对象时,让具体类(猫或狗)实现抽象类
然后再去实例化工厂接口,提供创建特定对象的方法(造猫对象的工厂或造狗对象的工厂)
3:单例设计模式:保证类在内存中只有一个对象
A:把构造方法私有
B:在成员位置自己创建一个对象(静态对象)
C:通过一个公共的方法提供访问(静态方法)
两种模式:
饿汉模式:类一加载就创建对象,即把创建的对象定义为静态
private static Student s = new Student();
public static Student getStudent() {
return s;
}
懒汉模式:什么时候用什么时候创建
private static Teacher t = null;
public synchronized static Teacher getTeacher() {
if (t == null) {
t = new Teacher();
}
return t;
}
因为懒汉模式中设计到多条语句操作共享数据,有线程安全问题,所以要写成同步方法。
4.模板设计模式:定义一个算法的骨架,而将具体的算法延迟到子类中来实现
如我要计算一个程序从开始运行到结束所用的时间,那么我就可以定义一个计算时间的算法骨架抽象类
让具体的的程序来继承这个算法类,然后创建对象来得到具体的时间
具体实现步骤:
A:定义算法骨架
public abstract class GetTime {
public long getTime() {
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
return end - start;
}
public abstract void code();
}
B:实现具体算法
public class ForDemo extends GetTime {
@Override
public void code() {
for (int x = 0; x < 100000; x++) {
System.out.println(x);
}
}
}
C:得到具体结果
public class GetTimeDemo {
public static void main(String[] args) {
GetTime gt = new ForDemo();
System.out.println(gt.getTime() + "毫秒");
}
}
5.装饰设计模式使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案
把手机的打电话功能定义为一个接口,创造一个抽象类实现该接口,使其具有打电话的功能
创建一个可以听音乐的具体手机类,使其继承上面的抽象类,则该手机类具有了打电话和听音乐的功能
则听音乐就是可以看成是抽象手机类的一个装饰,以后再需要什么样的装饰只需直接创建子类对象即可。
具体实现:
<span style="white-space:pre"> </span>public interface Phone {
public abstract void call();
}
public abstract class PhoneDecorate implements Phone {
private Phone p;
public PhoneDecorate(Phone p) {
this.p = p;
}
@Override
public void call() {
this.p.call();
}
}
public class MusicPhoneDecorate extends PhoneDecorate {
public MusicPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
super.call();
System.out.println("手机可以听音乐");
}
}
public class RingPhoneDecorate extends PhoneDecorate {
public RingPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
System.out.println("手机可以听彩铃");
super.call();
}
}
public class PhoneDemo {
public static void main(String[] args) {
Phone pd = new MusicPhoneDecorate(p);
pd.call();
System.out.println("------------");
pd = new RingPhoneDecorate(p);
pd.call();
}
}