【Java】 Java常用的几个设计模式实例
一.单例模式
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常用的几个设计模式实例的更多相关文章
- [ 转载 ] Java中常用的设计模式
Java中常用的设计模式 1.单例模式 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个 ...
- Java中常用的设计模式代码与理解
Java中常用的设计模式代码与理解 一.单例模式 1.饿汉式 (太饿了,类加载的时候就创建实例) /** * 饿汉式单例模式 */ public class HungrySingleInstance ...
- Java常用的几种设计模式
本来想写点spring相关的东西的,想来想去,先写点设计模式的东西吧 什么是设计模式?套用百度百科的话解释吧 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设 ...
- [ 转载 ] Java开发中的23种设计模式详解(转)
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...
- JAVA后端常用框架SSM,redis,dubbo等
JAVA后端常用框架SSM,redis,dubbo等 一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 spri ...
- Java的常用对象①②
Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...
- java中常用的字符串的截取方法
java中常用的字符串的截取方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...
- Java高级特性 第2节 java中常用的实用类(1)
一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...
- 使用JAVA实现的一个简单IOC注入实例
https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...
随机推荐
- Hive SQL 语法学习与实践
Hive 介绍 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供 ...
- JS检测浏览器版本信息(包含IE11),并动态添加样式
<head runat="server"> <meta http-equiv="Content-Type" content="tex ...
- 网页页头meta详解(科普知识)
1.Content-Type和Content-Language (显示字符集的设定) 说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内 ...
- PermissionUtils
import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; im ...
- phpmyadmin python mysql全部正常显示中文的关键
1. 建表.列时在phpmyadmin中将编码设置为utf8_general_ci 2. python中使用sql连接时设定charset为utf8,注意不能是utf-8! 例如: def Conne ...
- python接口测试之mock(一)
在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证在客户端开发的时候,api在 server端已经开发完成,专门等着前端来调用,理想的情况 ...
- ffmpeg 视频过度滤镜 gltransition
ffmpeg 视频过度滤镜 gltransition 上次随笔中提到的 ffmpeg-concat 可以处理视频过度,但是缺点是临时文件超大. 经过查找 ffmpeg 还有 gltransition ...
- 慕课网_细说多线程之Thread VS Runnable
第1章 课前准备 1-1 前言 (00:49) 第2章 Thread VS Runnable 2-1 回顾线程创建的两种方式 (02:33) 继承Thread类 class MyThread exte ...
- C#客户端填充外部IE浏览器中网页文本(input)且不提交
//引用COM组件//Microsoft HTML Object Library//Microsoft Internet Controls 记得改成x86 SHDocVw.ShellWindows ...
- git clone 指定分支操作
服务器迁移,而且原来本地开发是在同一个目录中切换不同的分支,感觉有点挫,于是打算一个文件目录对应一个分支,这样不会有太大的文件差异. 记录下来本次操作,可能以后还会用到. git初始化一般是这样. g ...