【笔记】面向对象设计模式
今天参加公司的学习会,学了几种设计模式,稍微回忆一下,并且自己找了一些补充资料进一步加深理解。
Singleton模式(单例模式)
看字面的意思就知道,一个类Class只有一个实例存在。单例模式的好处就是它限制了实例的个数,有利于节约内存,方便java回收。
它的写法也很简单,一看就懂。
public class Singleton{ private static Singleton instance = null;
private void Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
Factory模式(工厂模式)
工厂模式也同样简单,它相当于new实例化,只不过是将new进行封转,从而更方便扩展。
举个栗子,比方说要生成一个Product之前要做许多初始化工作,如果每次生成Product之前都要写这些初始化(init),会显得很繁琐,所以可以将init+new Product()封装成一个单独的类,以提高代码的重用性,减少耦合性。
Product也可能是一个接口,在Product的基础上会衍生出不同的Product子类出来。
比如:
interface IProduct(){}
class ProductA implements Product(){} class ProductB implements Product(){}
这样在使用这些子类的时候,就需要讲这些子类一一实例化。
Product A = new ProductA(); Product B = new ProductB();
如此一来就不方便对Product的扩展。因此我们就可以在Factory 中对Product进行再次封装。
public Factory { public static create(int i){ Product result=null; switch(i){ case 1:new ProductA();break; case 2:new ProcuctB();break; } return result; } }
Abstract Factory模式(抽象工厂模式)
抽象工厂模式其实是对上面所诉的工厂模式做进一步的抽象,适用于更加复杂的结构模式中。
在工厂模式中,我们仅仅是对Product进行实例化,那如果还要对Student,Teacher等完全不一样的类进行实例化时又该如何呢?
假如将所有的实例化都放在同一个工厂模式里面,想想都觉得这样的结构非常不清晰。因此针对完全不一样的类,我们可以在不同的工厂中进行实例化,并且将这些工厂类抽象到一个类中进行管理。
比如说
public abstract class Factory{ public abstract Sample creator(); public abstract Sample2 creator(String name); } public class SimpleFactory extends Factory{ public Sample creator(){ ......... return new SampleA } public Sample2 creator(String name){ ......... return new Sample2A } } public class BombFactory extends Factory{ public Sample creator(){ ...... return new SampleB } public Sample2 creator(String name){ ...... return new Sample2B } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?