设计模式总结(一):创建型模型

简介: 设计模式总结(一):创建型模型

1.单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

  • 注意:
  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。
import java.util.HashSet;
import java.util.Set;
public class SingleInstance {
    /**
     * 我用一个private的Static的变量来存放我们的SIngleInstance的实例
     */
    private static SingleInstance singleInstance = null;
    /**
     * 让构造方法编程私有的,这样我们可以防止在外面被其他类直接new出来,构造方   *  法同其它方法一样,也可以用private修饰,私有的构造方法无法在本类外部使   *  用,也就导致本类无法用new实例化,这样可以控制对象的生成。
     */
    private SingleInstance() {
    }
    /**
     * 我们提供一个静态的方法来创建我们的单例
     * @return
     */
    public static SingleInstance instance() throws InterruptedException {
        Thread.sleep(1000);
        if (singleInstance == null) {
            synchronized (SingleInstance.class) {
                if (singleInstance == null) {
                    System.out.println("我被new出来了");
                    singleInstance = new SingleInstance();
                }
            }
        }
        return singleInstance;
    }
    public static void main(String[] args) {
        Runnable runnable = () -> {
            try {
                instance();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
        Set<Thread> threads = new HashSet<>();
        for (int i = 0; i < 10; i++) {
            threads.add(new Thread(runnable));
        }
        threads.forEach(t -> t.start());
    }
}

参考链接:

https://www.cnblogs.com/qq895139140/p/7774152.html

1.1 懒汉式-线程不安全

单例类的实例在第一次被引用时候才被初始化。
public class Singleton {  
    private static Singleton instance=null;  
    private Singleton() {  
    }  
    public static Singleton getInstance(){  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

1.2 懒汉式-线程安全

这种方式效率比较低,性能不是太好,不过也可以用,因为是对整个方法加上了线程同步,其实只要在new的时候考虑线程同步就行了,这种方法不推荐使用。

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

1.3 饿汉式

单例类的实例在加载的时候就被初始化。

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

1.4 懒汉式-同步代码块

synchronized同步块括号中的锁定对象是采用的一个无关的Object类实例,而不是采用this,因为getInstance是一个静态方法,在它内部不能使用未静态的或者未实例的类对象

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

1.5 懒汉式–同步类(最终)

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

2. 简单工厂

简单来说:简单工厂模式主要是工厂类根据参数的不同来创建不同类的实例,通常这些不同类拥有同一个父类。因为静态方法,也叫做静态工厂模式。

其实JDK中也广泛使用了这种模式,如DataFormat类,根据参数不同,会创建data、time、datatime类等等。

2.1 简单实现

  • 简单工厂模式属于类创建型模式
  • 可以根据参数的不同返回不同的实例
  • 专门创建一个类来创建其他类的实例
  • 被创建的实例通常具有共同的父类

简单工厂中的角色:

  1. 抽象产品类
  2. 产品子类
  3. 工厂类
abstract class Product{
  public void use() {
  }
}
class ProductA extends Product {
  public void use(){
    System.out.println(使用了产品A);
  }
}
class ProductB extends Product {
    public void use(){
    System.out.println(使用了产品B);
  }
}
class Factory{
  public static Product createProduct(String type){
    if (type.equals(A)){
      return new ProductA();
    }else if (type.equals(B)) {
      return new ProductB();
    }
    return new ProductA();
  }
}
*/

2.2 优缺点

  • 优点:创建由专门的工厂类负责,客户端成员不用关心其是怎么创建的,直接使用就行。
  • (1)工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责
  • (2)客户端无需知道所创建具体产品的类名,只需知道参数即可
  • 缺点:工厂类不够灵活,如何新增一个产品,则需要修改逻辑,如果产品越多,则越复杂。
  • (1)工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响
  • (2)使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难
  • (3)系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂,违反开发封闭原则。

2.3适用环境

  • (1)工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂
  • (2)客户端只知道传入工厂类的参数,对如何创建对象不关心

2.4 扩充

工厂类:

根据参数,创建A/B产品,普通

直接多个方法,创建A/B产品,多方法

静态方法,创建A/B产品,静态方法


3. 工厂模式

3.1 简单工厂模式:

3.2 工厂模式:

注:从图上看,感觉更复杂了,但是,计算机中有一个“开闭原则”(扩展优于修改),这里举个例子,一个工厂,生产拖拉机,然后又生产口罩,那么为了更好的区别,最好是工厂下有个拖拉机工厂,有一个口罩工厂。

Jdk同样也用了这种思想:

4.抽象工厂方法

对类进行区分,如果都生产手机,你要生产口罩,则工厂方法就显得不合适了,因为接口功能不一样了,所以增加一个产品接口,表示一个大类,然后在工厂接口中,可以同时创建手机和口罩的对象,但是这样明显也违反了“开发封闭”原则。

5. 原型模型

6. 生成器模型

在产品结构比较复杂,构造过程比较繁琐,一次性构造比较难的时候,我们可以采取分而治之的原则,将产品组件化,每个组件由专门的厂商来生产,最后的产品指派给制定的车间进行最后装配.这种方式其实是现代制造业的一种典型的模式.比如汽车,飞机的制造等.这样做的好处是

  • 1.产品的部件由专门的生产厂商来生产,这样分工更加明确,更加精细,生产专业化,可以降低成本;
  • 2.整个产品的生产更加简单,也可增加零件的复用.
  • 3.转换生产比较容易,比如产品的材质发生变化,只需要找相应提供该材质的厂商即可.

目录
相关文章
|
5月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
32 5
|
6月前
|
设计模式 搜索推荐 数据库连接
第二篇 创建型设计模式 - 灵活、解耦的创建机制
第二篇 创建型设计模式 - 灵活、解耦的创建机制
|
5月前
|
设计模式 Oracle Java
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。
【6月更文挑战第20天】工厂模式简化对象创建,根据参数或条件生成MySQL或Oracle数据库连接。`DatabaseConnectionFactory`作为工厂,动态返回具体连接类型。装饰器模式则用于运行时动态增加对象功能,如`LoggingDecorator`为`Runnable`对象添加日志记录,保持代码整洁。在`Main`类中展示了如何使用这两种模式。
42 6
|
5月前
|
设计模式
创建型设计模式之建造者模式
创建型设计模式之建造者模式
|
5月前
|
设计模式 人工智能 自然语言处理
【设计模式】MVVM模式在AI大模型领域的创新应用
【设计模式】MVVM模式在AI大模型领域的创新应用
73 0
|
6月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~ 原型模式
[设计模式 Go实现] 创建型~ 原型模式
|
6月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~工厂方法模式
[设计模式 Go实现] 创建型~工厂方法模式
|
6月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~建造者模式
[设计模式 Go实现] 创建型~建造者模式
|
6月前
|
设计模式 JavaScript 前端开发
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
|
6月前
|
设计模式 缓存 架构师
创建型设计模式的比较与决策
本文深入探讨六种创建型设计模式:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。通过概述各模式的核心概念、应用场景和关键要素,帮助读者理解并掌握这些模式的核心思想。文章还通过比较表和决策流程图,直观地展示了各模式之间的差异和选择依据,为读者提供了实用的设计模式选择指南。 本文的特色在于结合了理论与实践,每个模式都配有详细的代码示例和结构图,帮助读者更好地理解和应用这些模式。 总之,本文旨在为读者提供一篇全面、深入且实用的创建型设计模式指南,帮助读者在实际工作中灵活运用这些模式...
99 0
创建型设计模式的比较与决策

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75