文章目录

  • 设计模式
    • 一、单例模式
      • 单例模式三种实现方式
        • 懒汉式
        • 饿汉式
        • 枚举式
      • 单例模式应用
    • 二、适配器模式
      • 适配器模式实现
      • 应用
    • 三、工厂模式
      • 简单工厂
        • 版本一: 模拟场景
        • 版本二:面向接口开发
        • 版本三:
      • 工厂方法模式

设计模式

一、单例模式

单例模式: 在内存中存在(仅)有限的对象(一般是一个)。控制内存中对象存在的数量。

单例模式三种实现方式

懒汉式

特点:使用对象时,再创建对象。再多线程环境下,线程不安全

两个线程(A,B)同时访问(1), A先访问,准备创建对象, B线程来到(1),判断 instance ==null ,也准备创建对象。

public class Singleton{private static Singleton instance = null; private Singleton(){} //先把构造方法初始化,防止被调用创建对象public static Singleton getInstance(){if(instance == null){   // (1)instance = new Singleton();//(2)}return instance;}}

如何保证线程安全?
第一种方式,在方法前面加同步锁synchronized。把每个线程都锁住 ,一个个判断是否为空,比较浪费时间。

public class Singleton{private static Singleton instance = null;private Singleton(){}public static synchronized Singleton getInstance(){if(instance == null){   instance = new Singleton();}return instance;}}

第二种方式 :双重检测模式
优点: 延迟加载

public class Singleton{private static volitle Singleton instance = null; //需要增加线程可见性volitle,假设创建完了,另一个线程就不再创建对象private Singleton(){}public static  Singleton getInstance(){if(instance == null){         synchronized(Singleton.class){ //锁住calss对象if(instance==null){instance = new Singleton();   }}}return instance;}}

饿汉式

先创建对象。JVM类加载器只会加载一次static对象,所以是线程安全的哦

public class Singleton{private static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}}

枚举式

枚举的底层也是一个static静态对象
详见另一篇博客

public enum Singleton{INSTANCE;
}

单例模式应用

  1. 工具类 : MybatisUtil
  2. 框架: Spring
  3. 封装

二、适配器模式

项目开发过程中,第一个版本 2019年开发,定义了接口 IWalk(走路), 发展2022年,有新的接口IRun(跑步), 原接口和新接口之间不匹配,产生一个适配器,将两个接口进行转换。

适配器模式实现

/*** 旧接口* @author Administrator**/
public interface IWalk {void walk();}
/*** 新接口* @author Administrator**/
public interface IRun {void run();
}public class RunImpl implements IRun {@Overridepublic void run() {System.out.println("飞快的跑");}
}

适配器类

public class Adapter implements IWalk {private IRun irun;public Adapter(IRun irun) {this.irun = irun;}@Overridepublic void walk() {irun.run();}
}
public class Test {public static void main(String[] args) {IWalk iw = new Adapter(new RunImpl());  //用旧接口iWalk,调到的是新接口的run()方法iw.walk();}
}
-------------------
执行结果:飞快的跑

应用

第三方的API,通过适配器对原有的api进行适配。

旧系统和新系统进行集成。

三、工厂模式

场景:

假设小明同学,中午出去吃午饭,有几个选择: 米线(XiaoAMei), 米饭菜(RiceHouse), 油泼面(HuXian)。

简单工厂

版本一: 模拟场景

public class HuXian {public void suply() {System.out.println("户县软面");}}public class RiceHouse {public void suply() {System.out.println("麻婆豆腐盖浇饭");}
}public class XiaoAMei {public void suply() {System.out.println("酸菜米线....");}}public class Student {private String name;public Student() {}public Student(String name) {this.name = name;}public void eat() {XiaoAMei xam = new XiaoAMei();xam.suply();}
}public class TestVersion01 {public static void main(String[] args) {Student s = new Student("小明");s.eat();}}

类和类之间关系的种类:

  1. 关联 2. 依赖 3. 聚合/组合(生命周期: 组合同生命周期) 4. 继承

版本二:面向接口开发

分析第一个版本的问题(缺点): HuXian xam = new HuXian();

  1. 类型: HuXian ,对象 HuXian
  2. 等号左右类型一致,写死类型和对象。不能替换

让三种选择都是实现ISuply接口

public interface ISuply {void suply();
}public class HuXian implements ISuply{@Overridepublic void suply() {System.out.println("户县软面");}}
public class RiceHouse implements ISuply{@Overridepublic void suply() {System.out.println("麻婆豆腐盖浇饭");}
}public class XiaoAMei implements ISuply{@Overridepublic void suply() {System.out.println("酸菜米线....");}
}

左侧固定接口,右侧可以替换3种选择

public class Student {private String name;public Student() {}public Student(String name) {this.name = name;}public void eat() {ISuply is = new XiaoAMei();is.suply();}}
public class TestVersion02 {public static void main(String[] args) {Student s = new Student("小明");s.eat();}
}

版本三:

分析面向接口开发的不足, new XiaoAMei();

ISupply is = new XiaoAMei(); ---->Student类—>eat() -->创建

面向对象—>对象–>对象是什么?

对象是一个具有一定职责的东西

类的职责不清 :Student类不需要创建、销毁 XiaoAMei的职责

new: 创建

改造: 将职责进行分离---->抽象出一个工厂来完成创建销毁的职责

解耦,解除类之间不必要的广联

public interface ISuply {void suply();
}public class HuXian implements ISuply{@Overridepublic void suply() {System.out.println("户县软面");}}
public class RiceHouse implements ISuply{@Overridepublic void suply() {System.out.println("麻婆豆腐盖浇饭");}
}public class XiaoAMei implements ISuply{@Overridepublic void suply() {System.out.println("酸菜米线....");}
}

resources包 新建配置文件 Menu.txt。直接在这里修改

XiaoAMei
public class FoodFactory {public static ISuply create() {    ISuply is = null;String path = FoodFactory.class.getResource("resources/Menu.txt").getPath();try {BufferedReader in = new BufferedReader(new FileReader(path));String line = in.readLine();String className = "com.dyit.version03." + line;//类的完整名称is = (ISuply) Class.forName(className).newInstance();     } catch (Exception e) {     e.printStackTrace();}return is;}
}
public class Student {private String name;public Student() {}public Student(String name) {this.name = name;}public void eat() {ISuply is = FoodFactory.create();is.suply();}
}

工厂方法模式

工厂可以进行扩展,定义抽象的工厂接口,具体的工厂延迟到实现类完成。

public interface IFoodLFactory {ISuply createFood(Class<? extends ISuply> is);  //生成一个继承于Isuply接口的对象
}
public class FoodFactoryImpl implements IFoodLFactory {@Overridepublic ISuply createFood(Class<? extends ISuply> is) {ISuply isu = null;try {isu =is.newInstance();} catch (Exception e) {e.printStackTrace();}return isu;}
}
public class TestFactory {public static void main(String[] args) {IFoodLFactory iff = new FoodFactoryImpl();ISuply is = iff.createFood(RiceHouse.class);is.suply();}
}

设计模式——单例、适配器和工厂模式相关推荐

  1. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式

    设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...

  2. 设计模式的征途—1.单例(Singleton)模式

    单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...

  3. 设计模式--常用8个设计模式 单例-策略-责任链-装饰者-迭代器模式-观察者模式-常用设计模式

    1创建型的设计模式-主要有单例模式和工厂模式 对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题 2结构型的设计模式-主要有代理模式和适配 ...

  4. Java设计模式(二)简单工厂模式—设计模式六大原则

    文章目录 设计模式六大原则 1. 开闭原则 2. 里氏代换原则 3. 依赖倒转原则 4. 接口隔离原则 5. 迪米特法则(最少知道原则) 6. 合成复用原则 工厂设计模式 什么是工厂模式 工厂模式的好 ...

  5. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  6. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

  7. 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...

  8. 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.简单工厂模式(Simple Factory Pattern)属于创建型模式.简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例, ...

  9. 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝

    目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...

  10. JAVA编写单例(Singleton)模式

    单例(Singleton)模式:在Java应用程序中,一个类Class只有一个实例存在. 第一种写法形式(饿汉式): 定义一个类,它的构造函数为private的,它有一个private的static的 ...

最新文章

  1. 中北大学c语言程序设计作业答案,2016年中北大学软件学院程序设计基础考研复试题库...
  2. keras 导出onnx并使用
  3. linux进程--多线程/多进程同步(十)
  4. 【Scratch】青少年蓝桥杯_每日一题_2.23_小猫来回走
  5. 新手学信息检索2:倒排表与存储
  6. 3.非关系型数据库(Nosql)之mongodb:升降序排序,排序分页,$all,$in,$nin,$or,$nor, $exists,游标,更新(update,$set,$unset,$inc)
  7. 【Redis学习】Redis持久化
  8. wordpress 资料管理系统_说一说库存管理系统。
  9. Mybatis-plus 多表联查实现(非手写sql)
  10. ubuntu系统安装TeamViwer远程控制软件
  11. podman加速器harbor私有镜像仓库
  12. 美团综合业务推荐系统的质量模型及实践
  13. PS去除图片白色背景
  14. 西门子哪款plc支持c语言,西门子PLC的几种编程语言简单介绍
  15. Python对遥感影像重采样,以及重采样方法
  16. inet manual 和 static 区别
  17. C语言控制台输入中的复制粘贴
  18. 使用CyclicBarrier模拟百米赛跑
  19. 上海交通大学计算机应用基础答案,计算机应用基础 上海交通大学
  20. Activity的生命周期方法

热门文章

  1. Codeforces 884F Anti-Palindromize 费用流
  2. 创建和分析二维桁架和梁结构研究(Matlab代码实现)
  3. ESP-12F WIFI远程电脑开机卡
  4. Win32编程-头文件与函数入口
  5. 学习3D建模可能遇到的问题?
  6. 小白电脑家庭版升级专业版
  7. 真酸啊!2021 年腾讯奖励部分员工 100 股!100股!!!
  8. 写一篇关于 供给侧改革 的申论
  9. Element el-rate 评分组件详解
  10. 推荐丨产品经理最常用的13款工具