黑马程序员——java中的设计模式

来源:互联网 发布:中国象棋棋谱软件 编辑:程序博客网 时间:2024/05/16 14:15

------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 {@Overridepublic 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;}@Overridepublic void call() {this.p.call();}}public class MusicPhoneDecorate extends PhoneDecorate {public MusicPhoneDecorate(Phone p) {super(p);}@Overridepublic void call() {super.call();System.out.println("手机可以听音乐");}}public class RingPhoneDecorate extends PhoneDecorate {public RingPhoneDecorate(Phone p) {super(p);}@Overridepublic 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();}}





0 0