什么是设计模式

  设计模式(Design pattern)是一套被反复使用、被多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式不是一种方法和技术,而是一种思想设计模式,和具体的语言无关,但是本文以Java为语言基础来讲解,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用。设计模式大概可以归纳为如下几类:
  • 创建型模式:对象的创建
  • 结构型模式:对象的组成(结构)
  • 行为型模式:对象的行为
下面分别介绍一些简单的常用设计模式。

单例模式(Singleton Pattern)

  单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。下面是单例模式的设计示例:

package cn.pattern;

/**
* Created by lili on 15/12/14.双重锁式
*/
public class SingletonClass { //全局单例对象instance,为了防止外部改变instance,将instance私有,不支持外界赋值和访问
//static修饰是因为对外公开的方法是静态的,所以在静态方法中访问外部的成员变量也必须是静态的.
private static SingletonClass instance = null; // 构造方法私有化,防止外界随意造对象,所以这样一来,此类只能内部造对象
private SingletonClass() {
} //不需要造对象就可以访问,必须将该方法设置为静态
//
public static SingletonClass getInstance() {
if (instance == null) {
//只有此处可以造对象,所以为了防止并发造多个对象,这里采取了同步代码块
synchronized (SingletonClass.class) {
if (instance == null) {
instance = new SingletonClass();
}
}
}
return instance;
} }

上述的写法是双重锁式,还有另外两种写法,分别是懒汉式和饿汉式:

/**
* 懒汉式,只有调用获取实例方法的时候才开始创建对象,比较懒
*/
public class SingletonClass {
private static SingletonClass instance = null; private SingletonClass() {
} public static synchronized SingletonClass getInstance() {
if (instance == null) {
instance = new SingletonClass();
}
return instance;
}
}
/**
* 饿汉式,类加载的时候就创建了,很饥饿
*/
public class SingletonClass { private static final SingletonClass instance = new SingletonClass(); private SingletonClass() {
} public static SingletonClass getInstance() {
return instance;
}
}

  具体开发中多用饿汉式,例如JDK中的Runtime就是饿汉式的设计。

简单工厂模式

  简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。这种简单模式的优点在于外界避免了创建对象的尴尬工作,只需要消费即可。但是这种模式的所有创建逻辑都在工厂类中,违背了高内聚的原则,而且当产品类多的时候,判断逻辑将和产品类型的判断相互交错会弄得很复杂,不利于维护和扩展。

  下面的例子是简单工厂的示例,Animal是产品对象的抽象接口,Dog和Cat是具体产品,工厂内部提供静态方法供外界调用,从而根据外界传入参数的不同来返回不同产品对象。

public class AnimalFactory {

    private 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;
}
}
}

工厂方法模式

  工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的,这一定程度上解决了简单工厂模式的弊端。工厂方法模式的核心结构有四个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品。

  工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

  下面借用一个简单示例来讲解:

  抽象工厂,只负责定义规范,具体生产由子类完成。

public interface Factory {
public abstract Animal createAnimal();
}

  具体工厂,每个产品对应一个具体工厂,犹如生产线一样,但是每个产品的生产线上都有工厂的一些共性,例如生产产品。

public class CatFactory implements Factory {
@Override
public Animal createAnimal() {
return new Cat();
}
}
public class DogFactory implements Factory {
@Override
public Animal createAnimal() {
return new Dog();
}
}

  最后,我们在用的时候,调用不同的具体工厂来生产对应的产品即可。

public class AnimalDemo {
public static void main(String[] args) {
Factory f = new DogFactory();
Animal a = f.createAnimal();
a.eat(); f = new CatFactory();
a = f.createAnimal();
a.eat();
}
}

【Java基础】Java设计模式简介的更多相关文章

  1. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  2. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  3. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  4. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  5. Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

    Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

  6. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  7. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  8. Java基础-Java数据类型

    Java基础-Java数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型的作用 数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围 ...

  9. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  10. 转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    原文:http://www.cnblogs.com/wang-meng/p/5898837.html 一:继承.抽象类与接口区别.访问控制(private, public, protected,默认) ...

随机推荐

  1. The 5th Zhejiang Provincial Collegiate Programming Contest------ProblemA:Accurately Say "CocaCola"!

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2965 题意:一群人玩过“7”的游戏,有7的数字或者7的倍数就要喊“coca ...

  2. Hibernate-Validation的使用

    首先是要加入下面两个包 hibernate-validator-4.1.0.Final.jar validation-api-1.0.0.GA.jar 如果在验证不通过的时候进行了添加.更新或删除操作 ...

  3. scala学习-类与对象

    类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: class Counter{ private var value ...

  4. C++模板使用介绍

    1. 模板的概念. 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同.正确的调用重载函数.例如,为求两个数的最大值,我们定义MAX()函数 ...

  5. HDU 1203 I NEED A OFFER!(01 背包DP)

    点我看题目 题意 : 中文题不详述. 思路 :类似于01背包的DP,就是放与不放的问题,不过这个要求概率,至少得到一份offer的反面就是一份也得不到,所以先求一份也得不到的概率,用1减掉就可以得到所 ...

  6. Android EditText中插入图片并响应点击事件

    EditText中插入图片基本就是两种方法: ,通过Html.fromHtml(..)来实现 [mw_shl_code=java,true]eText.append(Html.fromHtml(&qu ...

  7. 第十七章 委托 第十八章 Attribute 第十九章 可空值类型

    1.委托揭秘 定义一个委托,编译器会生成一个继承自System.MulticastDelegate的类,所有的委托都继承自该类. 由于委托是类,所以能定义类的地方,都能定义委托. 委托内部有一个tar ...

  8. NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理

    用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...

  9. Where is Vasya?

    Where is Vasya? Vasya stands in line with number of people p (including Vasya), but he doesn't know ...

  10. 安装php 带debug

    gdb安装包   在CentOS6.4下使用gdb进行调试的时候, 使用bt(breaktrace)命令时,会弹出如下的提示: 头一天提示: Missing separate debuginfos, ...