zoukankan      html  css  js  c++  java
  • 【笔记】面向对象设计模式

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

    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
      }
    
    }
  • 相关阅读:
    R语言中gsub使用示例记录
    linux 系统中wget实现并行下载
    R语言中实现将多行数据合并为一行
    python安装包国内镜像加速
    VMware Workstation 与 Device/Credential Guard不兼容
    缩放矩阵, 这里面有关于矩阵的 种种操作 这个要学下 很有用
    ffd 点的控制效果、
    摘抄 : max mel 的一些用法。
    帮朋友写的查找选择的父子骨骼。之前我都是用递归,这个好、
    距离的算法。 下面两个是对等的。
  • 原文地址:https://www.cnblogs.com/nonkicat/p/2661044.html
Copyright © 2011-2022 走看看