您的位置:首页 > 职场人生

【黑马程序员】Java基础学习博客——两种设计模式

2014-08-04 00:45 435 查看
------- android培训java培训、期待与您交流! ----------

设计模式:解决某一类问题行之有效的解决方法或者思想。

单例设计模式:

单例设计模式是解决什么问题的呢?

可以保证一个类的对象的唯一性。

比如:多个程序都要使用一个配置文件中的数据,而且要实现数据共享和交换,必须要将数据封装到一个对象中。而且多个程序操作的是同一个对象。那也就是说必须保证这个配置文件对象的唯一性。

怎么能保证对象的唯一性呢?

1,一个类只要提供了构造函数,就可以产生多个对象。无法保证唯一性,既然无法保证唯一,干脆将构造函数私有化不让其他类建立对象

2,不让其他类创建对象,那对象何在?干脆直接在本类中创建一个,这样的好处是可控。

3,创建完成后是不是要给其他程序提供访问方式呢?

实现步骤:

1,如何不让其他类创建对象嗯?

              直接私有化构造函数,不让其他程序创建对象初始化。

2,直接在本类中创建一个本类对象。

3,定义一个功能,其他对象都可以通过这个功能访问到本类对象。

注意事项:1,在自己写的时候忘记在private  static Single s = new Single();这句前面加static和private了

                   2,饿汉式忘记加if判断了

                  3,加了if之后又在s2前面加上了类型Single2.

if(s2==null)

   Single2 s2 = new  SingleDemo();

  return s//代码体现。
//饿汉式
class Single
{
//2,创建一个本类对象。
private static /*final*/ Single s = new Single();

//1,私有化构造函数。
private Single(){}

//3,定义一个方法返回这个对象。
public static Single getInstance()
{
return s;
}
}
//懒汉式
//单例的延迟加载方式。面试最多的是懒汉式。
class Single2
{
private static Single2 s2 = null;

private Single2(){}

public static Single2 getInstance()
{
if(s2==null)
s2 = new Single2();
return s2;
}
}

class SingleDemo
{
public static void main(String[] args)
{
//要想获取Single的对象。调用getInstance方法。既然无法通过对象调用,只能用类名调用,所以这个方法必须是static。
Single ss = Single.getInstance();
Single ss2 = Single.getInstance();

// Single ss = Single.s;//这种方式也可以实现对对象的访问,将其私有化提供方法来访问就是为了对对象可控。
// Single ss2 = Single.s;
}
}


模板方法设计模式:

模板方法模式(TEMPLATE METHOD),用于定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属于类行为型模式。模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。模板方法模式是一种基于继承的代码复用技术。

一、使用场景

1、一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。比如乘坐公交的步骤都是上车刷卡-乘车-下车刷卡,步骤不变,但根据目的地不同,乘车路线也不同,即乘车的行为是变化的。

2、将子类的公共行为抽取到父类中以避免代码重复。

3、控制子类扩展。模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。

package arrayview;

abstract class 模板方法设计模式 {

public void method()
{
long start = System.currentTimeMillis();
playcode();
long end = System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}

public  abstract void playcode();

}
class Demo3 extends 模板方法设计模式
{

@Override
public  void playcode() {
// TODO Auto-generated method stub
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
}

}
class RunClass
{
public static void main(String[] args) {

Demo3 d = new Demo3();
d.method();
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: