【笔记】面向对象设计模式

今天参加公司的学习会,学了几种设计模式,稍微回忆一下,并且自己找了一些补充资料进一步加深理解。

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
  }

}
复制代码

 

 

posted @   のんきネコ  阅读(161)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示