设计模式——单例、适配器和工厂模式
文章目录
- 设计模式
- 一、单例模式
- 单例模式三种实现方式
- 懒汉式
- 饿汉式
- 枚举式
- 单例模式应用
- 二、适配器模式
- 适配器模式实现
- 应用
- 三、工厂模式
- 简单工厂
- 版本一: 模拟场景
- 版本二:面向接口开发
- 版本三:
- 工厂方法模式
设计模式
一、单例模式
单例模式: 在内存中存在(仅)有限的对象(一般是一个)。控制内存中对象存在的数量。
单例模式三种实现方式
懒汉式
特点:使用对象时,再创建对象。再多线程环境下,线程不安全
两个线程(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;
}
单例模式应用
- 工具类 : MybatisUtil
- 框架: Spring
- 封装
二、适配器模式
项目开发过程中,第一个版本 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();}}
类和类之间关系的种类:
- 关联 2. 依赖 3. 聚合/组合(生命周期: 组合同生命周期) 4. 继承
版本二:面向接口开发
分析第一个版本的问题(缺点): HuXian xam = new HuXian();
- 类型: HuXian ,对象 HuXian
- 等号左右类型一致,写死类型和对象。不能替换
让三种选择都是实现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();}
}
设计模式——单例、适配器和工厂模式相关推荐
- 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式
设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...
- 设计模式的征途—1.单例(Singleton)模式
单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...
- 设计模式--常用8个设计模式 单例-策略-责任链-装饰者-迭代器模式-观察者模式-常用设计模式
1创建型的设计模式-主要有单例模式和工厂模式 对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题 2结构型的设计模式-主要有代理模式和适配 ...
- Java设计模式(二)简单工厂模式—设计模式六大原则
文章目录 设计模式六大原则 1. 开闭原则 2. 里氏代换原则 3. 依赖倒转原则 4. 接口隔离原则 5. 迪米特法则(最少知道原则) 6. 合成复用原则 工厂设计模式 什么是工厂模式 工厂模式的好 ...
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- 设计模式(1)--简单工厂模式、策略模式
设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...
- 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...
- 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.简单工厂模式(Simple Factory Pattern)属于创建型模式.简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例, ...
- 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝
目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...
- JAVA编写单例(Singleton)模式
单例(Singleton)模式:在Java应用程序中,一个类Class只有一个实例存在. 第一种写法形式(饿汉式): 定义一个类,它的构造函数为private的,它有一个private的static的 ...
最新文章
- 中北大学c语言程序设计作业答案,2016年中北大学软件学院程序设计基础考研复试题库...
- keras 导出onnx并使用
- linux进程--多线程/多进程同步(十)
- 【Scratch】青少年蓝桥杯_每日一题_2.23_小猫来回走
- 新手学信息检索2:倒排表与存储
- 3.非关系型数据库(Nosql)之mongodb:升降序排序,排序分页,$all,$in,$nin,$or,$nor, $exists,游标,更新(update,$set,$unset,$inc)
- 【Redis学习】Redis持久化
- wordpress 资料管理系统_说一说库存管理系统。
- Mybatis-plus 多表联查实现(非手写sql)
- ubuntu系统安装TeamViwer远程控制软件
- podman加速器harbor私有镜像仓库
- 美团综合业务推荐系统的质量模型及实践
- PS去除图片白色背景
- 西门子哪款plc支持c语言,西门子PLC的几种编程语言简单介绍
- Python对遥感影像重采样,以及重采样方法
- inet manual 和 static 区别
- C语言控制台输入中的复制粘贴
- 使用CyclicBarrier模拟百米赛跑
- 上海交通大学计算机应用基础答案,计算机应用基础 上海交通大学
- Activity的生命周期方法