你熟悉的设计模式有哪些?写出单例模式的实现代码 将一个类设计成单例设计模式,需要哪些步骤

作者&投稿:宰父邓 (若有异议请与网页底部的电邮联系)

23个设计模式:

根据目的设计模式可以分为创造模式,结构模式和行为模式,创建模式用于处理对象的创建。结构模式用于处理类或对象的组合。

行为模式用于描述类或对象如何交互以及如何分配职责,创建模式用于处理对象的创建。主要包括以下五种设计模式:

工厂方法模式()

抽象工厂模式(AbstractFactoryPattern)

建造者模式(BuilderPattern)

原型模式(PrototypePattern)

单例模式(SingletonPattern)

结构模式用于处理类或对象的组合,包括以下七个设计模式:

适配器模式(AdapterPattern)

桥接模式(BridgePattern)

组合模式(CompositePattern)

装饰者模式(DecoratorPattern)

外观模式(FacadePattern)

享元模式(FlyweightPattern)

代理模式(ProxyPattern)

行为模式描述类或对象如何交互以及它们如何分配职责。它由以下11种设计模式组成:

责任链模式(Chain的ResponsibilityPattern)

命令模式(CommandPattern)

解释器模式(InterpreterPattern)

迭代器模式(IteratorPattern)

中介者模式(MediatorPattern)

备忘录模式(MementoPattern)

观察者模式(ObserverPattern)

状态模式(StatePattern)

策略模式(StrategyPattern)

模板方法模式(TemplateMethodPattern)

访问者模式(VisitorPattern)

单例模式实现1:

公共类Singleton{

类共享实例对象

私有静态单例;单例=零;

//私有构造函数

私有Singleton(){

系统。出去了。这是单例!!);

//获取单例方法

公共同步静态单例getInstance(){

//确定共享对象是否为空,如何空一个新对象

If(singleton==null){

singleton=newsingleton();

返回单例。

单例模式实现2:

公共类Singleton{

类共享实例对象实例化

PrivatestaticSingletonSingleton=newSingleton();

//私有构造函数

私有Singleton(){

系统:出去了,这是单例!!);

//获取单例方法

公共静态单例getInstance(){

直接返回共享对象

返回单例。

扩展资料:

注意事项:

设计模式主要分三个类型:创建型和行为型。

Singleton:确保一个类只有一个实例,并为其提供一个全局访问点

AbstractFactory:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。

FactoryMethod:定义一个用于创建对象的接口,并让子类决定实例化哪个类。工厂方法将类的实例化延迟到子类。

Builder:将复杂对象的构造与其表示分离,使相同的构造过程可以创建不同的表示。

Prototype:指定要使用Prototype实例创建的对象的类型,并复制该原型来创建一个新对象。

Composite:将对象组合成树状结构,以表示整体各部分之间的关系。组合使用户一致地使用单个对象和组合对象。

Facade:为子系统fa中的一组接口提供一致的接口。Ade提供了一个高级接口,使子系统更易于使用。

Proxy:为其他对象提供一个代理,以控制对该对象的访问

Adapter:将一个接口类转换为客户想要的另一个接口类。适配器模式使那些由于接口不兼容而无法一起工作的类一起工作。

Decrator:式比子类化更灵活,可以为对象动态添加一些额外的职责。

Bridge:模式将抽象部分与其实现部分分离,以便它们可以独立地更改。

Flyweight:享元模式



一共23种设计模式!

引用《软件秘笈-设计模式那点事》书籍:

按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。

创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:
 工厂方法模式(Factory Method Pattern)
 抽象工厂模式(Abstract Factory Pattern)
 建造者模式(Builder Pattern)
 原型模式(Prototype Pattern)
 单例模式(Singleton Pattern)

结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:
 适配器模式(Adapter Pattern)
 桥接模式(Bridge Pattern)
 组合模式(Composite Pattern)
 装饰者模式(Decorator Pattern)
 外观模式(Facade Pattern)
 享元模式(Flyweight Pattern)
 代理模式(Proxy Pattern)

行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:
 责任链模式(Chain of Responsibility Pattern)
 命令模式(Command Pattern)
 解释器模式(Interpreter Pattern)
 迭代器模式(Iterator Pattern)
 中介者模式(Mediator Pattern)
 备忘录模式(Memento Pattern)
 观察者模式(Observer Pattern)
 状态模式(State Pattern)
 策略模式(Strategy Pattern)
 模板方法模式(Template Method Pattern)
 访问者模式(Visitor Pattern)

单例模式实现1:
public class Singleton {
// 类共享实例对象
private static Singleton singleton = null;
// 私有构造方法
private Singleton() {
System.out.println("-- this is Singleton!!!");
}
// 获得单例方法
public synchronized static Singleton getInstance() {
// 判断 共享对象是否为null ,如何为null则new一个新对象
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}

单例模式实现2:
public class Singleton {
// 类共享实例对象 实例化
private static Singleton singleton = new Singleton();
// 私有构造方法
private Singleton() {
System.out.println("-- this is Singleton!!!");
}
// 获得单例方法
public static Singleton getInstance() {
// 直接返回共享对象
return singleton;
}
}

单例模式 <?php class Example { // 保存类实例在此属性中 private staticExample类中的普通方法 public function bark() { echo 'Woof!'; } //

JAVA 采用单例设计模式设计日志处理类,并写出代码~

import java.util.Date;public class Logger {private static Logger instance;private static Class clazz;private Logger() {}private Logger(Class clazz) {this.instance = new Logger();this.clazz = clazz;}public static Logger getLogger(Class clazz) {if (instance == null) {synchronized (Logger.class) {if (instance == null) {instance = new Logger(clazz);}}}return instance;}public void info(String msg) {System.out.println(clazz.getName() + "[" + new Date().toLocaleString()+ "][info]:" + msg);}public void error(String msg) {System.out.println(clazz.getName() + "[" + new Date().toLocaleString()+ "][error]:" + msg);}public void warn(String msg) {System.out.println(clazz.getName() + "[" + new Date().toLocaleString()+ "][warn]:" + msg);}public void log(String msg) {System.out.println(clazz.getName() + "[" + new Date().toLocaleString()+ "][log]:" + msg);}public static void main(String args[]) {Logger s = Logger.getLogger(String.class);s.info("普通消息");}}

单例模式(Singleton Pattern)是一个比较简单的模式。

定义:
确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。

通用类图:


通用代码:
Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。
/**
* 线程安全的单例模式
* 饿汉式单例
* @author Administrator
*
*/
public class Singleton {

private static final Singleton singleton = new Singleton();

// 限制产生多个对象
private Singleton() {
}

// 通过该方法获得实例对象
public static Singleton getSingleton() {
return singleton;
}

// 类中其他方法尽量是static
public static void doSomething() {

}
}



单例模式的优点:
由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显了。
由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决。
单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

单例模式的缺点:
单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能用mock的方式虚拟一个对象。
单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。

单例模式的使用场景:
要求生成唯一序列号的环境;
在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;
需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。

单例模式的注意事项:
1. 在高并发情况下,请注意单例模式的线程同步问题。
/**
* 懒汉式单例
* @author Administrator
*
*/
public class Singleton2 {

private static Singleton2 singleton = null;

// 限制产生多个对象
private Singleton2() {
}

// 通过该方法获得实例对象
public static Singleton2 getSingleton() {
synchronized (singleton) {
if (singleton == null) {
singleton = new Singleton2();
}
}
return singleton;
}
}


如果不加synchronized进行控制,如果第一个线程A执行到singleton = new Singleton2(),但还没有获得对象,第二个线程B也在执行,执行到if (singleton == null)判断,那么线程B获得判断条件为真,于是继续运行下去,线程A和B都获得了对象,内存中就出现了两个对象。
建议使用饿汉式单例,那是线程安全的单例模式。

2. 需要考虑对象的复制情况。在Java中,若实现Cloneable接口,并实现了clone方法,则可以直接通过对象复制方式创建一个新对象,对象复制是不用调用类的构造函数的。

3. 注意JVM的垃圾回收机制,如果我们的一个单例对象在内存中长久不使用,JVM就认为这是一个垃圾对象,在CPU资源空闲的情况下该对象会被清理掉,下次再调用时就需要产生一个新对象。如果该对象作为有状态值的管理,则会出现状态恢复原状的情况,就会出现故障。
有两种方法可以解决该问题
1、由容器管理单例的生命周期
Java EE容器或者框架级容器(如Spring)可以让对象长久驻留内存。
2、状态随时记录
可以使用异步记录的方式,或者使用观察者模式,记录状态的变化,写入文件或写入数据库中,确保即使单例对象重新初始化也可以从资源环境获得销毁前的数据,避免应用数据丢失。

单例模式的扩展:
能产生固定数量实例的单例模式
/**
* 能产生固定数量实例的单例模式
* @author Administrator
*
*/
public class Singleton3 {

// 最多能产生的实例数
private static int maxNumOfSingleton = 2;

// 定义一个列表,容纳所有实例
private static ArrayList singletonList = new ArrayList();

// 产生所有对象
static {
for (int i = 0; i < maxNumOfSingleton; i++) {
singletonList.add(new Singleton3());
}
}

// 限制其他类生成对象
private Singleton3() {
}

// 随机获得一个实例
public static Singleton3 getInstance() {
Random random = new Random();
return singletonList.get(random.nextInt(maxNumOfSingleton));
}

}

常用的设计模式有哪些?
答:Prototype(原始模型模式),Singleton(单例模式),Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式),Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式)...

Java中23种设计模式——单例模式
答:枚举法:天生的守护者,利用枚举的特性,实现简单且线程安全的单例,避免反射和序列化带来的麻烦。ThreadLocal:专为多线程设计,每个线程拥有独立的副本,解决共享实例难题。注册式单例的革新:采用静态Map管理单例对象,当需要时,实例化并返回。在诸如线程池、数据库连接池、日志对象和配置文件等场景中,...

java设计模式(java设计模式有哪些)
答:十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。十九、Proxy,代理模式:为其他对象提供一种代理以控制对...

java中常用到得设计模式有哪几种(java常用的设计模式及应用场景)_百度...
答:单例模式(SingletonPattern)结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:适配器模式(AdapterPattern)桥接模式(BridgePattern)组合模式(CompositePattern)装饰者模式(DecoratorPattern)外观模式(FacadePattern)享元模式(FlyweightPattern)代理模式(ProxyPattern)行为型模式用来对类或对象...

23种设计模式知识要点,你都了解了吗?
答:23种设计模式知识要点分别是工厂方法,抽象工厂,单例,建造者,原型,适配器,桥接,装饰器,组合,外观,享元,代理,模板方法,策略,命令,责任链,中介者,观察者,备忘录,迭代器,访问者,状态,解释器模式。设计模式是指在软件开发中常用的解决问题的代码结构的总结和抽象。在代码开发中采用设计...

列出几种软件开发中常见的设计模式并解释
答:1.单例模式(SingletonPattern):单例模式旨在确保一个类只有一个实例,并提供全局访问点。它常用于需要全局唯一实例的情况,例如日志记录器或数据库连接。2.工厂模式(FactoryPattern):工厂模式通过定义一个创建对象的接口,但将对象的具体实现延迟到子类或具体工厂类来决定。它可以隐藏对象的创建逻辑,使...

大学生福音Java常见设计模式总结
答:单例模式的优点在于:系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能可以严格控制客户怎么样以及何时访问单例对象。单例模式的写法有好几种,主要有三种:懒汉式单例、饿汉式单例、登记式单例。 5、创建型-原型模式: 在Java 中,原型模式的核心是就是原型类 Prototype,...

设计模式有哪些
答:总体来说设计模式分为三大类:一、创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。二、结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。三、行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式...

spring主要运用那些设计模式,单例模式是怎么实现的?
答:第三种:单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。核心提示点:Spring下默认的bean均为singleton,可以通过singleton=“...

Android 开发中常用到的设计模式有哪些?
答:设计模式总共是23种,常用的有下面几种 :1 单例模式,application 就是单例 可以存储一些数据例如记录activity的启动数量 ;2 观察者模式: button的onClickListener ,监听button的响应;3 适配器模式 :例如recyclerView 的adapter ;4 命令模式: 例如开源库eventBus ,把数据封装好 发送出去,然后...