简要分析Java程序的几种设计模式

  今天整理了一下已学的几种JAVA设计模式,也是比较经典常用的几种。

1 单例模式singelton   项目开发中往往有这样的需求:某个对象 只需要存在一个(不用new出多个) 即保证该类有且只有一个实例

  单例模式有两种实现方法

(1)饿汉式(下面通过一段代码进行解析)

class Singlet{
     //构造方法私有化 不允许外界再创建
      private Singlet(){

      }
      //static Singlet s = new Singlet();
     private static Singlet s = new Singlet();
     //加了private 外界又无法访问 (封装性)
     //饿汉式 声明时就给他赋值 开辟空间

     public static Singlet getS(){
        return s;
    }
 }
class SingletDemo{
    public static void main(String args[]){
         //Singlet.s;//拿出该实例

         Singlet s1 = Singlet.getS();//拿出该实例
   } }

解析:以上用的饿汉式的写法,为了保证有且只有一个对象,那么构造方法私有化,即外界无法调用到,在本类中new出一个对象s 并给他一个getter方法,方便后面的主类中取出这个唯一的实例。

(2) 懒汉式(下面通过一段代码进行解析)

class Singlet2{
  private Singlet(){

  }
  private static Singlet2 s2;
  public static Singlet getS2(){
  if(s2 ==null){//需要用到时 才创建
    s2 = new Singlet2();
    }
  return s2;
  }
class SingletDemo{
  public static void main(String args[]){

  Singlet2 s3 = Singlet2.getS2();//拿出该实例
  }
}

解析:懒汉式和饿汉式不同的点在于,

饿汉式是实例在建立是就给他一个准确内存空间private static Singlet s = new Singlet()。

懒汉式是建立实例时,给他赋一个null,等到要调用getter函数时,再检查实例有无值,无值再给他创立内存空间。

由此可见,饿汉式是线程安全的,虚拟机一开始就加载了这部分内存空间,懒汉式是线程不安全的,需要加同步方法。

实际应用中多用饿汉式。

2.模板模式  通过抽象类去实现 父类提供一个或多个通用方法(需要子类继承) 和 抽象方法(需要子类复写)

  下面通过一个简单图形例子来进行解析。(统一打印图形的周长和面积)

abstract class Tuxing{
  //以下两个称为钩子方法 用抽象方法 是子类有所差异的,让他们自己去复写
  abstract double getArea();
  abstract double getZC();

  public void print(){//打印方法 是普通方法,子类继承的
    System.out.println(getArea());
    System.out.println(getZC());
  }
}

class juxing extends Tuxing{//矩形,继承图形这个抽象类
  private int a;
  private int b;
  public juxing(int a ,int b){
  this.a = a;
  this.b = b;
  }
  double getArea(){
    return a * b;
  }
  double getZC(){
    return 2 * a * b;

  }
}
class circle extends Tuxing{
  private int r;
  public circle(int r){
    this.r = r;

  }
  double getArea(){
    return 3.14 * r * r;
  }
  double getZC(){
    return 2 * 3.14 * r;
  }
}//以下为主方法

public class TempDemo{
  public static void main(String args[]){
    Tuxing t = new circle(5);//创建圆的图形
    t.print();//结果输出元的周长和半径

    t = new juxing(2,3);
    t.print();
  }
}

解析 :用一般方法时 ,往往需要在矩形类或者圆形类中写出打印的代码 这样造成了代码的赘余和重复,采用模板的方式,在父类写出相同的代码方法(即为模板),这样子类就必须继承,用实例去调用,实现功能。

3.简单工厂模式  简单来说 就是讲创建实例 写作一个工厂类 屏蔽子类(工厂中不同的产品)之间的差异

代码分析如下:

在工厂设计中,往往需要有多处相同的改动,简单工厂模式,做到了将多处不同的在一个工厂类中实现,见代码分析

//定义一个手机接口,规定手机的性能协议等一系列问题
public interface ICellphone {
  void SendMsg();
}

//以下两个类继承手机接口 复写接口中的SendMsg方法
class Android implements ICellphone{
  public void SendMsg() {
  System.out.println("安卓手机发送信息");
  }

}
class Iphone implements ICellphone{

  public void SendMsg() {
  System.out.println("苹果手机发送信息");

  }
}
//以下是主类
public class FactoryDemo {

  public static void main(String[] args) {
  // TODO Auto-generated method stub
    ICellphone p = new Android();
      p.SendMsg();//安卓手机发送短信
    /*↑传统方法 直接new出自己想要的手机
      但此时问题出现 如果要求将安卓改为苹果 就要将上述的new Android()改为new IPhone(),如果此时安卓的个数很多 将会很麻烦*/
    /*以上问题的出现 来源于 要造什么手机 的问题
       方法:传建一个“工厂” 让它用来造手机 而不是让他们在主类中造 见最下的类*/

    p = factory.creat("IPhone");
    p.SendMsg();//苹果手机发送短信
    p = factory.creat("Android");

}

}
//以下为手机工厂
class factory{
  //设为static,方便调用 括号内加参数,方便用户自定义手机型号
   public static ICellphone creat(String type){
   if(type.equals("Android")){
      return new Android();
   }else if(type.equals("IPhone")){
     return new Iphone();
   }
   return null;

   }
}

以上 这就是简单工厂模式 消除子类之间的差异
缺点在于 每次新添加新的手机型号,就要在工厂类中新加if(type.equals(ooxx)) 做判断

下面用反射机制来实现简单工厂模式,解决上述问题

将工厂模式改为
public class factory {
  public static Product getphone(String className) throws Exception, {
    return (ICellphone)Class.forName(className).newInstance(); 
  }
}
主类中
  p = factory.getphone("包名.IPhone"); //要传进的参数是类的全限定名
  p.SendMsg();//苹果手机发送短信
  p = factory.getphone("包名.Android");

4.适配器模式 

以下用实际例子解析一下

/*
定义一个窗口的标准
*/

interface IWindow{

  void max();//最大化

  void min();//最小化

  void close();//关闭
}

//我自己搞的窗口MyWindow,如果直接继承该接口,所有的方法都要复写,我只想要一个关闭功能就可以了

//此时可以考虑使用 适配器模式

//窗体适配器,
abstract class WindosAdapter implements IWindow//使用abstract修饰,目的是为了保证不准别人来创适配器对象
{
//让适配器去实现标准,并全部覆写方法,但是方法体为空
  public void max(){}
  public void min(){}
  public void close(){}
}

class MyWindow extends WindosAdapter
{
//应当覆写三个方法
//我只关心close方法

  public void close(){
    System.out.println("关闭我的小窗口");
  }

}

class AdapterDemo
{
  public static void main(String[] args)
  {
    IWindow win = new MyWindow();
    win.close();

  }
}

时间: 2024-10-27 00:24:26

简要分析Java程序的几种设计模式的相关文章

如何利用 JConsole观察分析Java程序的运行,进行排错调优(转)

如何利用 JConsole观察分析Java程序的运行,进行排错调优 博客分类: JAVA JavaOracleSUNEclipseJDK 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从命令行启

[设计模式](转)Java中的24种设计模式与7大原则

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole

Java编程的23种设计模式

设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每

用jmap分析java程序

之前的随笔提到用jstack分析java线程情况,也是在这个项目中,当线程的问题解决之后,发现程序的内存一直增长,于是用jmap工具分析了一下java程序占用内存的情况. 命令很简单,直接 jmap -histo 22955 > jmap.info 其中22955是java的pid,重定向到jmap.info文件中,其内容为: num #instances #bytes class name ---------------------------------------------- 1: 58

JAVA开发的23种设计模式之 --- 桥接模式

桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多个角度分类,每一种角度都可能变化.    解释:桥接模式将继承模式转化成关联关系,他降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量.    理解抽象化,实现化,解耦        抽象化:将复杂物体的一个或几个共同的特性抽出去而只注意其他特性的行动或过程.在java面向对象中抽象化就

JDK自带的运行监控工具JConsole观察分析Java程序的运行

原文地址:https://blog.csdn.net/libaolin198706231987/article/details/55057149 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从

java常见的几种设计模式

设计模式 1.概述 1)设计模式(Design pattern):是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结: 2)分类: 创建型模式(创建对象的): 单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 行为型模式(对象的功能): 适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式. 结构型模式(对象的组成): 模版方法模式.命令模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式.状态模式.策略模式.职责链模式.访问者模式. 2.简

Java中的几种设计模式

如果从事JAVA相关的开发,都不可避免的要用到抽象和封装,这是JAVA的一个特点,同时也是每个开发者必须掌握的,JAVA是这样,Android更是如此.而设计模式就是告诉我们应该如何写出高效且更具应用性和拓展性的代码,最近也是学习了几类比较常用的设计模式,下面一一列举出来,虽然说的不细,但是应该知道的我会做个总结. #####单例设计模式##### 单例设计模式的一般定义:一个类中只允许有一个实例. 实现思路:让类的构造方法私有化,同时提供一个静态方法去实例化这个类. 代码 : static c