在系统分析师的备考过程中,设计模式是一个重要的知识点,其中工厂模式和单例模式更是频繁出现在考试中。本文将深入解析这两种模式的适用场景、UML类图及代码实现,并通过反模式案例来加深理解,帮助考生精准提分。
一、工厂模式
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需向客户端暴露创建逻辑。工厂模式通常分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。
- 适用场景:
- 当一个类不知道它所需要的对象的类时,可以使用工厂模式。
- 当一个类希望由其子类来指定它所创建的对象时,可以使用工厂方法模式。
- 当需要创建一组相关或相互依赖的对象时,可以使用抽象工厂模式。
- UML类图:
工厂模式的UML类图主要包括一个抽象工厂类、多个具体工厂类、一个抽象产品类和多个具体产品类。抽象工厂类声明了创建产品的接口,具体工厂类实现了这个接口,创建具体的产品。抽象产品类定义了产品的通用特性,具体产品类实现了这些特性。
- 代码实现:
以简单工厂模式为例,假设有一个电视机的生产工厂,可以生产不同品牌的电视机。代码实现如下:
// 抽象产品类
public abstract class TV {
public abstract void play();
}
// 具体产品类
public class SonyTV extends TV {
@Override
public void play() {
System.out.println("Playing Sony TV...");
}
}
public class SamsungTV extends TV {
@Override
public void play() {
System.out.println("Playing Samsung TV...");
}
}
// 简单工厂类
public class TVFactory {
public static TV createTV(String brand) {
switch (brand) {
case "Sony":
return new SonyTV();
case "Samsung":
return new SamsungTV();
default:
throw new IllegalArgumentException("Unknown brand: " + brand);
}
}
}
二、单例模式
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。
- 适用场景:
- 当需要控制资源的访问时,可以使用单例模式,例如数据库连接池。
- 当需要频繁创建和销毁对象时,可以使用单例模式来减少内存开销。
- 当需要实现全局配置或全局缓存时,可以使用单例模式。
- UML类图:
单例模式的UML类图相对简单,主要包括一个单例类和一个静态方法用于获取单例实例。
- 代码实现:
以下是一个经典的单例模式实现:
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
三、反模式案例:滥用单例
单例模式虽然有很多优点,但如果滥用也会带来问题。例如,如果一个系统中的多个模块都依赖于同一个单例对象,那么当这个单例对象需要修改时,就会影响到所有依赖它的模块,导致系统难以维护和扩展。这就是滥用单例的反模式案例。
为了避免滥用单例,我们可以考虑以下几点:
- 尽量减少单例的使用,只在必要时使用。
- 使用依赖注入等技术来降低模块之间的耦合度。
- 考虑使用其他设计模式来替代单例模式,例如工厂模式或原型模式。
总之,工厂模式和单例模式是系统分析师备考中的重要知识点。通过深入理解这两种模式的适用场景、UML类图及代码实现,并注意避免滥用单例的反模式,考生可以更好地掌握这些设计模式,并在考试中取得好成绩。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!




