【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 ...
随机推荐
- img控件的居中显示 ---js技术
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- spark MLlib 概念 5: 余弦相似度(Cosine similarity)
概述: 余弦相似度 是对两个向量相似度的描述,表现为两个向量的夹角的余弦值.当方向相同时(调度为0),余弦值为1,标识强相关:当相互垂直时(在线性代数里,两个维度垂直意味着他们相互独立),余弦值为0, ...
- 类组件(Class component)和函数式组件(Functional component)之间有何不同
类组件不仅允许你使用更多额外的功能,如组件自身的状态和生命周期钩子,也能使组件直接访问 store 并维持状态当组件仅是接收 props,并将组件自身渲染到页面时,该组件就是一个 ‘无状态组件(sta ...
- 精简版 Selenium PageFactory, Annotation 实例
精简版 Selenium PageFactory, Annotation 实例. 先是类: HomePage package com.test;import org.openqa.selenium. ...
- 浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象
ylbtech-浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象 1.返回顶部 1. Boolean 对象 Boolean 对象表示两个值:"tr ...
- [Flask]通过render_form快捷渲染表单
依赖: Bootstrap-Flask 实例化方式与flask_bootstrap相同. 关于render_form(): Bootstrap-Flask内置了两个用于渲染WTForms表单类的宏,r ...
- [VBA]利用正则表达式创建函数处理字符串
1.去除字符串中的数字 Function aa(sr As Range)Set reg = CreateObject("vbscript.regexp")With reg.Glob ...
- 【6】font-size 字体属性
font-style -- 字体风格 font-variant -- 小型大写字母文本 font-weigh ...
- Prism中在Region中注入匹配问题
简单实例说明 [Export] public partial class TitleView : UserControl { public TitleView() { InitializeCompon ...
- linux(centOS7)的基本操作(四) 定时任务——crontab
概述 对于Java开发人员,定时任务并不陌生,无非是让系统在特定时间执行特定的命令或程序.例如spring提供的@Scheduled注解.OpenSymphony提供的quartz框架,都可以实现定时 ...