Java的常见模式

适配器模式

 package com.huawei;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; import java.util.Observable;
import java.util.Observer; interface Window
{
public void open();
public void close();
public void active();
} abstract class WindowAdapter implements Window
{
public void open(){}
public void close(){}
public void active(){}
} class WindowImpl extends WindowAdapter
{
public void open()
{
System.out.println("Open.......");
}
public void close()
{
System.out.println("Close.......");
}
public void active()
{
System.out.println("Active.......");
}
} public class ForNumber
{
public static void main(String args[])
{
Window win = new WindowImpl();
win.open();
win.close();
}
}

工厂模式

 package com.huawei;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; import java.util.Observable;
import java.util.Observer; interface Fruit
{
public void eat();
} class Apple implements Fruit
{ public void eat()
{
System.out.println("Eat Apple");
} } class Orange implements Fruit
{
public void eat()
{
System.out.println("Eat Orange");
}
}
//定义工厂
class Factory
{
public static Fruit getInstance(String className)
{
Fruit f = null;
if ("apple".equals(className))
{
f = new Apple();
} if ("orange".equals(className))
{
f = new Orange();
} return f;
}
} public class ForNumber
{
public static void main(String args[])
{
Fruit f = null; //定义接口对象
f = new Factory().getInstance("apple");
f.eat();
}
}

 代理模式

 package com.ftl.xmlparse;

 interface Network
{
public void browse();
} class Real implements Network
{ public void browse()
{
System.out.println("Real Connection...");
} } class Proxy implements Network
{
private Network network; public Proxy(Network network)
{
this.network = network;
} public void check()
{
System.out.println("Checking...");
} public void browse()
{
this.check();
this.network.browse();
} } public class TestDemo
{
public static void main(String[] args)
{
Proxy proxy = new Proxy(new Real());
proxy.browse();
System.out.println("-------------");
Network net = new Proxy(new Real());
net.browse();
}
}

单例模式

 package com.ftl.xmlparse;
// 懒汉法: 来一个开一个内存地址空间
class Singleton{
public static Singleton single = null;
private Singleton(){}; public static Singleton getSingleton(){
single = new Singleton();
return single;
}
} // 饿汉法: 线程不安全
class Singleton1 {
public static Singleton1 single = null;
private Singleton1(){}; public static Singleton1 getSingleton1(){
if(single != null){
single = new Singleton1();
}
return single;
}
} // 轮番法: 线程安全,却效率低
class Singleton2 {
public static Singleton2 single = null;
private Singleton2(){}; public static Singleton2 getSingleton2(){
synchronized (Singleton1.single) {
if(single != null){
single = new Singleton2();
}
}
return single;
}
}
// 轮番法: 线程安全,却效率低
class Singleton4 {
public static Singleton4 single = null;
private Singleton4(){}; public static Singleton4 getSingleton4(){
if(single != null){
synchronized (Singleton1.single) {
single = new Singleton4();
}
}
return single;
}
} // 双重校验锁
// volatile:一般的变量是在寄存器内,一个变量一个寄存器,添加了volatile关键字后,变量保存在内存中
// 告诉系统直接从内从中获取变量的数值,且变量的更改会通知到每个线程,确保了数据的安全
// 且不允许编译系统优化代码,必须按照代码的顺序编译
class Singleton3 {
public static volatile Singleton3 single = null;
private Singleton3(){};
public static Singleton3 getSingleton3(){
if(single == null){
synchronized (Singleton1.single) {
if(single == null){
single = new Singleton3();
}
}
}
return single;
}
} public class TestDemo
{
public static void main(String[] args)
{
Singleton singleton = Singleton.getSingleton();
Singleton1 singleton1 = Singleton1.getSingleton1();
Singleton2 singleton2 = Singleton2.getSingleton2();
Singleton3 singleton3 = Singleton3.getSingleton3();
Singleton4 singleton4 = Singleton4.getSingleton4();
}
}

生产者消费者模式

 package com.ftl;

 import java.util.HashMap;
import java.util.Map;
/**
* 生产者和消费者模型
*
* @author 小a玖拾柒
* Date: 2018年8月18日
*
*/ class Info{
private String name;
private String content;
private boolean flag = false; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public synchronized void set(String name, String content){
// System.out.println("进入到set函数()...");
if(flag){
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.setName(name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.setContent(content);
this.flag = true;
super.notify();
} public synchronized void get(){
// System.out.println("进入到get函数()...");
if(!flag){
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Name:" + this.getName() + ", Content:" + this.getContent());
this.flag = false;
super.notify();
}
} class Producer implements Runnable{
private Info info;
private boolean flag = true;
public Producer(Info info){
this.info = info;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0 ; i < 10; i++){
if(flag){
this.info.set("A", "AAAA");
this.flag = false;
}else{
this.info.set("B", "BBBB");
this.flag = true;
}
}
} } class Consumer implements Runnable{
private Info info; public Consumer(Info info){
this.info = info;
}
@Override
public void run() {
for(int i = 0 ; i < 10; i++){
this.info.get();
}
}
}
public class Test2018 {
public static void main(String[] args) {
Info info = new Info();
Consumer con = new Consumer(info);
Producer pro = new Producer(info);
new Thread(con).start();
new Thread(pro).start();
}
}

[生产者消费者更多参考] https://www.cnblogs.com/chentingk/p/6497107.html

Java学习---常见的模式的更多相关文章

  1. java运行时内存模式学习

    学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...

  2. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  3. Java设计模式学习之工厂模式

    在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了.Java 设计模式之工厂模式 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低 ...

  4. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

  5. Java 学习

    effective+java第三版 2016-09-23 15:25 effective+java第三版 相关问答 EffectiveJava第28条中关于泛型的一个疑问? @又名耶稣谢邀 一.先说说 ...

  6. 转:Java学习路线图,专为新手定制的Java学习计划建议

    转自:http://blog.csdn.net/jinxfei/article/details/5545874 怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业 ...

  7. java学习路线(好资源大家分享)

    对于入门java将近两年的时间,曾经迷惘过,一直想知道java的具体学习路线,看过了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,发现没有一个符合我个人需求的学习路线,根 ...

  8. 一份Java学习路线图

    Java学习路线图 本文会持续更新,敬请关注.下划线的文字会在这个博客继续更新. 回顾自己的Java学习经历,从学校的课堂到现在每天的项目开发,一份路线路线图浮出来. 其中有未做好的地方,也有自我感觉 ...

  9. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

随机推荐

  1. Hive的Shell里hive> 执行操作时,出现FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask错误的解决办法(图文详解)

    不多说,直接上干货! 这个问题,得非 你的hive和hbase是不是同样都是CDH版本,还是一个是apache版本,一个是CDH版本. 问题详情 [kfk@bigdata-pro01 apache-h ...

  2. linux安装QQ截图

    本人(壮壮熊)现用系统是ubuntu 12.04 相信用过linux系统的朋友都知道,linux下的截图软件是在不咋的.虽然系统本身有带截图工具,但是却苦于没有办法在截下来的图片上作画圈.写文字说明等 ...

  3. CUBA-Platform将全面助力中国开发者

    关注CUBA的伙伴们,你们好! 今天我们有新的进展告诉大家. 九月十五日到十六日CUBA平台事业部负责人(同时也是Haulmont公司合伙人)专程来到中国与CUBA中国团队进行了两天时间的交流.讨论. ...

  4. 玩转树莓派《二》——用python实现动画与多媒体

    环境:树莓派,系统raspbian,系统自带两个版本的python以及pygame. 1.画板 程序如下: !/home/pi/game_1.py import pygame width = 640 ...

  5. [转]bootstrap-datetimepicker 火狐浏览器报错

    本文转自:https://segmentfault.com/a/1190000008457568 使用bootstrap-datetimepicker日期选择插件时发现在火狐浏览器下报错: 未压缩版报 ...

  6. ado.net中的 sqlconnection sqlcommand datareader dataset SqlDataAdapter之间的关系

    Connection: 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能够知道是 ...

  7. get/post 接口调用

    content-type:  application/~~~~~ /// <summary> /// Post数据到网站 /// </summary> /// <para ...

  8. 【转】Java面试题全集(上)

    准备从C#转java,在找工作之前准备看看面试题,有幸看到大神的作品,mark一下,以后慢慢看... 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅 ...

  9. mac平台安装配置TomCat

    1.下载Tomcat 7.0 地址:http://tomcat.apache.org/download-70.cgi Binary Distributions -> Core 选择zip或tar ...

  10. 四、curator recipes之共享重入互斥锁

    简介 curator的recipes实现了可重入互斥锁,允许你在分布式场景下多个进程之间实现锁的互斥以协调多进程执行. 相关类:InterProcessMutex 官方文档:http://curato ...