【再探】设计模式— 工厂方法、单例及原型模式

2024-04-29 22:44

本文主要是介绍【再探】设计模式— 工厂方法、单例及原型模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 创建型设计模式是处理对象创建的设计模式,主要特点是“将对象的创建与业务代码分离”。一共有五种:工厂方法模式、单例模式、原型模式、抽象工厂模式及建造者模式。

1 单例模式

需求:

  1. 在整个系统中只需要一个实例。
  2. 管理共享资源,例如数据库连接、配置文件读取等,可以减少资源消耗,提高性能。

1.1 单例模式介绍

确保某个类只有一个实例,自行实例化并且向整个系统提供这个实例。

图 单例模式UML

饿汉模式

在程序启动时就进行对象的实例化,单例对象会在类被加载时创建。实现简单、线程安全。但是无法进行懒加载,会带来一定的系统开销。

懒汉模式

类加载时不会创建单例对象,而是等到真正需要的时候才创建。懒汉模式第一次调用时才初始化,避免了内存浪费,但是需要注意线程安全问题。

枚举

实现单例的最佳方法,自动支持序列化机制、防止多次实例化并且线程安全。

图 实现单例模式的方式

public class HungryModel {private HungryModel() {}private final static HungryModel instance = new HungryModel();public static HungryModel getInstance() {return instance;}
}
public class DoubleCheckLocking {private DoubleCheckLocking() {}private static DoubleCheckLocking instance = null;public static DoubleCheckLocking getInstance() {if (instance == null) {synchronized (DoubleCheckLocking.class) {if (instance == null) instance = new DoubleCheckLocking();}}return instance;}
}
public class IoDHSingleton {private IoDHSingleton() {}private static class Holder {static final IoDHSingleton instance = new IoDHSingleton();}public static IoDHSingleton getInstance() {return Holder.instance;}}

1.1.1 优缺点

优点:确保一个类在系统中只有一个实例,节约系统资源,提高性能。

缺点:不符合单一职责原则。

2 原型模式

需求:

  1. 需要频繁创建属性近似的对象。
  2. 需要保持对象在某个时刻的状态。

2.1 原型模式介绍

通过一个已存在的对象克隆出多个一摸一样的对象。

图 原型模式UML

public class Address implements Cloneable{public Address() {}@Overridepublic Address clone() throws CloneNotSupportedException {return (Address)super.clone();}@Overridepublic String toString() {return "Address(" + Integer.toHexString(hashCode()) + ")";}
}public class User implements Cloneable{private List<Address> addressList;public void setAddressList(List<Address> addressList) {this.addressList = addressList;}@Overridepublic User clone() throws CloneNotSupportedException {User clone = (User)super.clone();if (addressList != null) {List<Address> newList = new ArrayList<>();for (Address address : addressList) {newList.add(address.clone());}clone.setAddressList(newList);}return clone;}public static void main(String[] args) throws CloneNotSupportedException {User user = new User();List<Address> addresses = new ArrayList<>();addresses.add(new Address());addresses.add(new Address());user.setAddressList(addresses);User clone = user.clone();System.out.println(user);System.out.println(clone);}@Overridepublic String toString() {return "User(" + Integer.toHexString(hashCode()) +"){" +"addressList=" + addressList +'}';}
}

2.1.1 优缺点

优点:1)减少了代码量;2)可读性、可维护性好,耦合度减小。

缺点:2)不符合单一职责原则;2)不符合开闭原则。当对象添加新的属性时可能需要修改代码。

3 工厂方法模式

需求:

  1. 将对象创建与业务代码剥离。
  2. 让用户在不需要知道具体的类型情况下,创建符合的对象。
  3. 隐藏创建这个实例的创建细节。

3.1 工厂方法模式介绍

将对象的创建与自身的业务逻辑分离。定义一个有创建对象接口的工厂,把创建对应产品的细节封装在不同的工厂实现类中。每增加新的产品,只需增加该产品以及对应的工厂实现类。

图 工厂方法模式UML

public class Car {private String engine;protected Car(String engine) {this.engine = engine;}
}public class BMWCar extends Car{public BMWCar(String engine) {super(engine);}
}public class TeslaCar extends Car{public TeslaCar(String engine) {super(engine);}
}

 

public interface CarFactory {Car buildCar();
}public class BMWCarFactory implements CarFactory{@Overridepublic Car buildCar() {return new BMWCar("汽油发动机");}
}public class TeslaCarFactory implements CarFactory{@Overridepublic Car buildCar() {return new TeslaCar("电动发动机");}
}
public class CarShop {public static void main(String[] args) {CarFactory carFactory = new BMWCarFactory();carFactory.buildCar();carFactory = new TeslaCarFactory();carFactory.buildCar();}
}

3.1.1 优缺点

优点:1)符合单一职责原则,可读性好。2)符合开闭原则,扩展性好。3)符合依赖倒置原则,耦合度降低。

缺点:类的数量增加,增加了系统的复杂性,可能会影响性能。

这篇关于【再探】设计模式— 工厂方法、单例及原型模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947348

相关文章

Android自定义View的实现方法(转自郭霖博客)

一些接触Android不久的朋友对自定义View都有一丝畏惧感,总感觉这是一个比较高级的技术,但其实自定义View并不复杂,有时候只需要简单几行代码就可以完成了。 如果说要按类型来划分的话,自定义View的实现方式大概可以分为三种,自绘控件、组合控件、以及继承控件。那么下面我们就来依次学习一下,每种方式分别是如何自定义View的。 一、自绘控件(完全自己画) 自绘控件的意思就是,这个Vi

03Linux的学习方法

Linux Kernel非常小巧精致,可以在省电及低配的硬件上运行。 Linux的企业运用 网络服务器(当今最热门的运用)关键任务的应用(金融数据库、大型企业)学术机构的高性能运算任务 Linux的个人运用 桌面计算机 在Linux系统上装一个X Window System软件之后,就能有桌面了。手持设备嵌入式系统 Linux的学习路线 学习计算机概论及硬件相关知识从Linux的安装

毕设帮(5188.help)开发日志3——最小原型、迭代式开发

前面两篇博客我已经和大家分享了关于毕设帮构想的由来,我也对毕业设计市场进行了详细的分析,要是感兴趣可以读一读:         毕设帮(5188.help)开发日志——毕设帮构想的由来         毕设帮(5188.help)开发日志2——我的构想有市场吗?         在构思和市场分析之后,我便投入了软件设计阶段。         最一开始的问题便是我该选择

Ubuntu network device not managed 解决方法

今天服务器重装Ubuntu 18.04系统之后,发现有线网卡设备显示network device not managed,用ifconfig也没有显示设备,下面是解决方法,供大家参考。 修改NetworkManager.conf sudo vim /etc/NetworkManager/NetworkManager.conf 将managed改为true: [ifupdown]mana

贪心算法(三)——最佳合并模式

问题描述 给定n个有序文件,每个文件的记录数分别为w1~wn,请给出一种两两合并的方案,使得总合并次数最少。 注意: 1. 外排序算法是将多个有序文件合并成一个有序文件的过程。 2. 在一次合并的过程中,两个文件中的所有记录都需要先从文件中读入内存,再在内存中排序,最后将排序的结果写入文件中。 3. 假设两个待排序文件记录数分别为n、m,那么将这两个文件合并成一个有序的文件需要

(delphi11最新学习资料) Object Pascal 学习笔记---第12章操作类(类方法和类数据)

第12章 操作类 ​ 在过去的几章中,你已经了解了 Object Pascal 语言面向对象的基础:类、对象、方法、构造函数、继承、后期绑定、接口等等。现在,我们需要进一步了解与类管理相关的一些更高级、更具体的语言特性。从类引用到类助手(class helper),本章涵盖了许多其他 OOP 语言所没有的功能,或者至少在实现上有很大的不同。 ​ 本章的重点是类,以及在运行时对类的操作。在第 1

设计模式3——简单工厂模式

简单工厂模式 简单工厂模式是工厂方法模式的衍生,实现起来较容易,也是一种创建型模式。 目录 一、简短概述  二、优缺点  三、使用过程 四、举例 一、简短概述  当有一堆相似的对象需要被创建时,可以使用一个简单工厂去管理如何创建它们,这样在我们需要创建某个对象时,把任务交给这个简单工厂即可。  主要包含两种角色: 简单工厂(单个对象):控制创建哪些对象的类产品(

linux高性能测试:CPU 模式批量由cpupower转performance

CPU动态节能技术用于降低服务器功耗,通过选择系统空闲状态不同的电源管理策略,可以实现不同程度降低服务器功耗,更低的功耗策略意味着CPU唤醒更慢对性能影响更大。对于对时延和性能要求高的应用,建议关闭CPU的动态调节功能,禁止 CPU休眠,并把CPU频率固定到最高。通常建议在服务器BIOS中修改电源管理为Performance,如果发现CPU模式为conservative或者powersav

分享四种CAD图纸加密方法,严防盗图

在数字化时代,cad图纸的盗用和非法传播问题日益突出。对于企业和设计师来说,保护设计成果的安全性和原创性,采取有效的cad加密方法至关重要。本文将分享四种cad加密方法,帮助您严防盗图,保护图纸安全。 使用cad软件内置的加密功能 许多CAD软件都内置了加密功能,可以对图纸文件进行加密保护。这些加密功能通常简单易用,且能够提供基本的文件保护。使用软件内置的加密功能,您可以设置密码,限制对CAD

eclipse 调试时出现!MESSAGE Could not find bundle: org.eclipse.equinox.console解决方法

eclipse 调试时出现!MESSAGE Could not find bundle: org.eclipse.equinox.console解决办法 eclipse 调试时出现!MESSAGE Could not find bundle: org.eclipse.equinox.console解决办法   在用ECLIPSE调试OSGI时出现异常错误无法开打OSGI> !SESS