一.单例模式

public class SingletonDemo {
public static void main(String[] args) {
//
}
} class User1{//饿汉式
User1(){ }
private static User1 zs = new User1();
private static User1 getZs(){
return zs;
}
}
class User2{//懒汉式
private User2(){ }
private static User2 ls = null;
private synchronized static User2 getLs(){//为了线程安全,加上synchronized修饰
if(ls == null){
ls = new User2();
}
return ls;
}
} class User3 {// 双重加锁机制
private User3() { } private static User3 ww = null; private static User3 getWw() {
if (ww == null) {
synchronized (User3.class) {//只有ww为null的时候,创建过程中加上同步锁
if (ww == null) {
ww = new User3();
}
}
}
return ww;
}
}

二.简单工厂模式 

public class SimpleFactoryDemo {
public static void main(String[] args) {
Factory.create("productA");
Factory.create("ProductB");
}
} interface Product {
//声明类所需继承的共同接口,也可以是抽象类
}
class ProductA implements Product {
public ProductA() {
System.out.println("ProductA");
}
} class ProductB implements Product {
public ProductB() {
System.out.println("ProductB");
}
} class Factory {
//可以在工厂类中添加任何你所需要的逻辑
public static Product create(String str)
{
//生成ProductA
if(str.equalsIgnoreCase("ProductA"))
{
return new ProductA();
}
else
//生成ProductB
if(str.equalsIgnoreCase("ProductB"))
{
return new ProductB();
}
return null;
} }

三.工厂方法模式

public class FactoryMethodDemo {
public static void main(String[] args) {
Factory factory = new FactoryA();
factory.createProduct();
factory = new FactoryB();
factory.createProduct();
}
}
interface Product{}
interface Factory {
//声明产生产品类的方法
public Product createProduct();
}
class ProductA implements Product {
public ProductA() {
System.out.println("ProductA");
}
}
class ProductB implements Product {
public ProductB() {
System.out.println("ProductB");
}
} class FactoryA implements Factory {
//实现工厂类的方法生成产品类A
public Product createProduct()
{
return new ProductA();
} } class FactoryB implements Factory {
//实现工厂类的方法生成产品类B
public Product createProduct()
{
return new ProductB();
}
}

四.抽象工厂模式

public class AbstractFactory {
public static void main(String[] args) {
Factory factory = new FactoryA();
factory.createGift();
factory.createProduct();
}
} interface Product{}
interface Gift {}//也可以是抽象类
class ProductA implements Product {
public ProductA() {
System.out.println("ProductA");
}
}
class ProductB implements Product {
public ProductB() {
System.out.println("ProductB");
}
}
class GiftA implements Gift {
public GiftA(){
System.out.println("GiftA");
}
}
class GiftB implements Gift {
public GiftB(){
System.out.println("GiftB");
}
} interface Factory {
public Product createProduct();
public Gift createGift(); }
class FactoryA implements Factory {
@Override
public Product createProduct(){
return new ProductA();
}
@Override
public Gift createGift(){
return new GiftA();
}
} class FactoryB implements Factory {
@Override
public Product createProduct(){
return new ProductB();
}
@Override
public Gift createGift(){
return new GiftB();
} }

五.适配器模式

public class AdapterDemo {
public static void main(String[] args) {
SmallPort smallPort = new SmallPort() {//手机自带小的接口
public void useSmallPort() {
System.out.println("使用的是手机小的接口");
}
};
//需要一个大的接口才可以连上电脑,小口转换为大口
BigPort bigPort=new SmallToBig(smallPort);
bigPort.useBigPort();
}
} interface BigPort { public void useBigPort();//使用的大口
} interface SmallPort {
public void useSmallPort();//使用小口
} class SmallToBig implements BigPort{ private SmallPort smallPort;//小口 public SmallToBig(SmallPort smallPort){//获得小口
this.smallPort=smallPort;
}
@Override
public void useBigPort() {
this.smallPort.useSmallPort(); //使用小口
} }

六.策略模式

public class StrategyDemo {
public static void main(String[] args) {
Car smallCar = new SmallCar("路虎","黑色");
Car bussCar = new BussCar("公交车","白色");
Person p1 = new Person("小明", 20);
p1.driver(smallCar);
p1.driver(bussCar);
}
} interface CarFunction {
void run(); //每辆车有不同的行驶方法
} class Car implements CarFunction {
protected String name; //车名字
protected String color; //车颜色 public Car(String name, String color) {
this.name = name;
this.color = color;
} @Override
public void run() {
System.out.println(color +" " + name +"在行驶。。。");
} }
class SmallCar extends Car { public SmallCar(String name, String color) {
super(name, color);
}
@Override
public void run() {
System.out.println(color +" " + name +"在高速的行驶。。。");
} }
class BussCar extends Car{ public BussCar(String name, String color) {
super(name, color);
}
@Override
public void run() {
System.out.println(color +" " + name +"在缓慢的行驶。。。");
}
}
class Person {
private String name;
private Integer age; public void driver(Car car){
System.out.print(name +" "+ age+" 岁 "+" 开着");
car.run();
} public Person(String name,Integer age) {
this.name=name;
this.age=age;
} }

七.代理模式(静态代理)

public class StaticProxyDemo {
public static void main(String[] args) {
ProxySubject subject = new ProxySubject(new RealSubject());
subject.visit();
}
}
interface Subject {
void visit();
}
class RealSubject implements Subject { private String name = "byhieg";
@Override
public void visit() {
System.out.println(name);
}
}
class ProxySubject implements Subject{
private Subject subject;
public ProxySubject(Subject subject) {
this.subject = subject;
} @Override
public void visit() {
subject.visit();
}
}

八.代理模式(动态代理)

public class DynamicProxyDemo {
public static void main(String[] args) {
//创建一个实例对象,这个对象是被代理的对象
Person zhangsan = new Student("张三");
//创建一个与代理对象相关联的InvocationHandler
InvocationHandler stuHandler = new StuInvocationHandler<Person>(zhangsan);
//创建一个代理对象stuProxy来代理zhangsan,代理对象的每个执行方法都会替换执行Invocation中的invoke方法
Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[]{Person.class}, stuHandler);
//代理执行上交班费的方法
stuProxy.giveMoney();
}
}
interface Person {
//上交班费
void giveMoney();
}
class Student implements Person {
private String name;
public Student(String name) {
this.name = name;
} @Override
public void giveMoney() {
try {
//假设数钱花了一秒时间
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "上交班费50元");
}
}
class MonitorUtil { private static ThreadLocal<Long> tl = new ThreadLocal<>(); public static void start() {
tl.set(System.currentTimeMillis());
} //结束时打印耗时
public static void finish(String methodName) {
long finishTime = System.currentTimeMillis();
System.out.println(methodName + "方法耗时" + (finishTime - tl.get()) + "ms");
}
}
class StuInvocationHandler<T> implements InvocationHandler {
//invocationHandler持有的被代理对象
T target; public StuInvocationHandler(T target) {
this.target = target;
} /**
* proxy:代表动态代理对象
* method:代表正在执行的方法
* args:代表调用目标方法时传入的实参
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理执行" +method.getName() + "方法");
//代理过程中插入监测方法,计算该方法耗时
MonitorUtil.start();
Object result = method.invoke(target, args);
MonitorUtil.finish(method.getName());
return result;
}
}

【Java】 Java常用的几个设计模式实例的更多相关文章

  1. [ 转载 ] Java中常用的设计模式

    Java中常用的设计模式 1.单例模式 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个 ...

  2. Java中常用的设计模式代码与理解

    Java中常用的设计模式代码与理解 一.单例模式 1.饿汉式 (太饿了,类加载的时候就创建实例) /** * 饿汉式单例模式 */ public class HungrySingleInstance ...

  3. Java常用的几种设计模式

    本来想写点spring相关的东西的,想来想去,先写点设计模式的东西吧 什么是设计模式?套用百度百科的话解释吧 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设 ...

  4. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

  5. JAVA后端常用框架SSM,redis,dubbo等

    JAVA后端常用框架SSM,redis,dubbo等   一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 spri ...

  6. Java的常用对象①②

    Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...

  7. java中常用的字符串的截取方法

    java中常用的字符串的截取方法   1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...

  8. Java高级特性 第2节 java中常用的实用类(1)

    一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...

  9. 使用JAVA实现的一个简单IOC注入实例

    https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...

随机推荐

  1. Hive SQL 语法学习与实践

    Hive 介绍 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供 ...

  2. JS检测浏览器版本信息(包含IE11),并动态添加样式

    <head runat="server"> <meta http-equiv="Content-Type" content="tex ...

  3. 网页页头meta详解(科普知识)

    1.Content-Type和Content-Language (显示字符集的设定)  说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内 ...

  4. PermissionUtils

    import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; im ...

  5. phpmyadmin python mysql全部正常显示中文的关键

    1. 建表.列时在phpmyadmin中将编码设置为utf8_general_ci 2. python中使用sql连接时设定charset为utf8,注意不能是utf-8! 例如: def Conne ...

  6. python接口测试之mock(一)

    在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证在客户端开发的时候,api在 server端已经开发完成,专门等着前端来调用,理想的情况 ...

  7. ffmpeg 视频过度滤镜 gltransition

    ffmpeg 视频过度滤镜 gltransition 上次随笔中提到的 ffmpeg-concat 可以处理视频过度,但是缺点是临时文件超大. 经过查找 ffmpeg 还有 gltransition ...

  8. 慕课网_细说多线程之Thread VS Runnable

    第1章 课前准备 1-1 前言 (00:49) 第2章 Thread VS Runnable 2-1 回顾线程创建的两种方式 (02:33) 继承Thread类 class MyThread exte ...

  9. C#客户端填充外部IE浏览器中网页文本(input)且不提交

    //引用COM组件//Microsoft HTML Object Library//Microsoft Internet Controls  记得改成x86 SHDocVw.ShellWindows ...

  10. git clone 指定分支操作

    服务器迁移,而且原来本地开发是在同一个目录中切换不同的分支,感觉有点挫,于是打算一个文件目录对应一个分支,这样不会有太大的文件差异. 记录下来本次操作,可能以后还会用到. git初始化一般是这样. g ...