【Java基础】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设计模式简介的更多相关文章
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.
- Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...
- Java基础-Java中的并法库之线程池技术
Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java基础-Java数据类型
Java基础-Java数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型的作用 数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
原文:http://www.cnblogs.com/wang-meng/p/5898837.html 一:继承.抽象类与接口区别.访问控制(private, public, protected,默认) ...
随机推荐
- PAT-乙级-1017. A除以B (20)
1017. A除以B (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求计算A/B,其中A是不超过 ...
- itext 落雨 out of membery Memory Optimization
Memory Optimization If a document deals with a lot of data or large elements, such as images, it is ...
- PHP运算符及php取整函数
ceil -- 进一法取整 说明 float ceil ( float value ) 返回不小于 value 的下一个整数,value 如果有小数部分则进一位.ceil() 返回的类型仍然是 flo ...
- 中国首个 SaaS 模式的云告警平台安卓版 APP 上线
今年一月底,国内首个 SaaS 模式的云告警平台 OneAlert 正式发布了 iOS 版 App 客户端,今天上午,安卓版 App 客户端也正式上线了!每个安卓用户,无需电脑,都可以通过手机全程跟踪 ...
- Hex string convert to integer with stringstream
#include <sstream>#include <iostream>int main() { unsigned int x; std::stringstream ss; ...
- 使用rsyslog+loganalzey收集日志显示客户端ip
http://www.ituring.com.cn/article/128536 rsyslog localhost 转发 http://bigsec.net/one/tool/rsyslog.htm ...
- FZU-1924+判断环/DFS/BFS
dfs: /* dfs */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include< ...
- CentOS7 64位 自动分配IP地址设置
vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 # ifcfg-后接网卡名称 配置如下,ONBOOT设置为yes HWADDR=:0C::E9 ...
- 验证Android用户输入日期
如何验证用户输入的日期是有效还是无效? private Pattern pattern; private Matcher matcher; private static final String DA ...
- socket关闭动作以及socket状态的总结
主要部分,四次握手: 断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类的函数开始主动终止一个连接.这里先暂时说正常情况.当调用close ...