常见设计模式

AI时代,做一个古法编程逆行者 :)

最近 vibecoding 太多,手写一会儿代码,还别有一番风味~


单例模式:

懒汉式:

复制代码
public class Singleton{
	private static volatile Singleton instance;
	private Singleton(){};
	public static Singleton getInstance(){
		if(instance==null){
			synchronized(Singleton.class){
				if(instance==null){
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

饿汉式:

复制代码
public class Singleton{
	private static final Singleton instance = new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){
		return instance;
	}
}

静态内部类:

复制代码
public class Singleton{
	private Singleton(){};
	private static class Create{
		static final Singleton instance = new Singleton();
	}
	public static Singleton getInstance(){
		return Create.instance;
	}
}

工厂模式:

简单工厂模式:

复制代码
interface Button{
	void create();
}
public class WindowsButton implements Button{
	public void create(){
		System.out.println("Windows按钮创建成功!");
	}
}
public class MacButton implements Button{
	public void create(){
		System.out.println("Mac按钮创建成功!");
	}
}
public class ButtonFactory{
	public static Button createButton(String type){
		if("Windows".equalsIgnoreCase(type)){
			return new windowsButton;
		}
		else if("Mac".equalsIgnoreCase(type)){
			return new macButton;
		}
		else{
			throw new IllegalArgumentException("暂不支持该平台类型"+type);
		}
	}
}

工厂方法模式:复用上方的Button接口和两种实现类,将工厂解耦,这样添加商品时,只需要增加类,不需要修改旧类。

复制代码
interface ButtonFactory{
	Button create();
}
public class WindowsButtonFactory implements ButtonFactory{
	public Button create(){
		return new WindowsButton();
	}
}
public class MacButtonFactory implements ButtonFactory{
	public Button create(){
		return new MacButton();
	}
}

抽象工厂模式:就是在工厂方法里面返回产品族。

复制代码
interface Checkbox{
	void create();
}
public class WindowsCheckbox implements Checkbox{
	public void create(){
		System.out.println("Windows复选框创建成功!");
	}
}
public class MacCheckbox implements Checkbox{
	public void create(){
		System.out.println("Mac复选框创建成功!");
	}
}
interface AbstractFactory{
	Button createButton();
	Checkbox createCheckbox();
}
public class WindowsFactory implements AbstractFactory{
	public WindowsButton createButton(){
		return new WindowsButton();
	}
	public WindowsCheckbox createButton(){
		return new WindowsCheckbox();
	}
}
public class MacFactory implements AbstractFactory{
	public MacButton createButton(){
		return new MacButton();
	}
	public MacCheckbox createCheckbox(){
		return new MacCheckbox();
	}
}

策略模式:

复制代码
interface PayStrategy{
	void pay(int amount);
}
class WeChat implements PayStrategy{
	public void pay(int amount){
		System.out.println("微信支付成功!");
	}
}
class Credit implements PayStrategy{
	public void pay(int amount){
		System.out.println("信用卡支付成功!");
	}
}
class Pay{
	private PayStrategy strategy;
	public void setPayStrategy(PayStrategy strategy){
		this.strategy = strategy;
	}	
	public void checkOut(int amount){
		strategy.pay(amount);
	}
}

责任链模式:

复制代码
abstract class Approver{
	protected Approver next;
	public abstract void handleRequest(int leaveDays);
	public void setNext(Approver next){
		this.next = next;
	}
}
class Boss extends Approver{
	public void handleRequest(int leaveDays){
		System.out.println("通过");
	}
}
class Manager extends Approver{
	public void handleRequest(int leaveDays){
		if(leaveDays<7){
			System.out.println("通过");
		}
		else if(next!=null){
			next.handleRequest(leaveDays);
		}
	}
}
class GroupLeader extends Approver{
	public void handleRequest(int leaveDays){
		if(leaveDays<2){
			System.out.println("通过");
		}
		else if(next!=null){
			next.handleRequest(leaveDays);
		}
	}
}
class Main{
	public static void main(String[] args){
		Boss a = new Boss();
		Manager b = new Manager();
		GroupLeader c = new GroupLeader();
		c.setNext(b);
		b.setNext(a);
		c.handleRequest(7);
	}
}

更新补充

装饰器模式:

复制代码
abstract class MyInputStream{
	abstract public void run();
}
class FileInputStream extends MyInputStream{
	@Override
	public void run(){
	System.out.println("文件输入流");
	}
}
abstract class FilterInputStream extends MyInputStream{
	private MyInputStream in;
	public FilterInputStream(MyInputStream in){
		this.in = in;
	}
	@Override
	public void run(){
		in.run();
	}
}
class BufferInputStream extends FilterInputStream{
	public BufferInputStream(MyInputStream in){
		super(in);
	}
	@Override
	public void run(){
		super.run();
		System.out.println("输入缓冲池");
	}
}
class EpInputStream extends FilterInputStream{
	public EpInputStream(MyInputStream in){
		super(in);
	}
	@Override
	public void run(){
		super.run();
		System.out.println("加密处理");
	}
}
class Main{
	public static void main(String[] args){
		FileInputStream in = new FileInputStream();
		BufferInputStream bi = new BufferInputStream(in);
		EpInputStream ei = new EpInputStream(bi); 
		ei.run();
	}
}
相关推荐
凤凰院凶涛QAQ10 分钟前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案1 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
MindUp2 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG4772 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
程序员天天困2 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端
战血石LoveYY3 小时前
Integer类型超限,导致数据异常
java·算法
CaffeinePro3 小时前
SOLID五大设计原则:重构优雅代码与架构的底层规范
设计模式·架构
乐观的Terry4 小时前
1、为什么要自己造发布系统
java·spring boot·后端·spring cloud·架构
饮茶三千4 小时前
电子保函模板编辑器实战二:HTML→FTL 编译转换的设计与实现
前端·vue.js·设计模式
Kel4 小时前
Node.js 本质:从全脉络视角理解运行时原理
javascript·设计模式·node.js