首页 > 其他分享 >设计模式-创建型模式1:单例模式+工厂模式

设计模式-创建型模式1:单例模式+工厂模式

时间:2024-08-14 15:05:24浏览次数:13  
标签:__ 模式 class 单例 工厂 new 设计模式 public cls

单例模式

  • 单例模式是创建型设计模式
  • 核心思想:一个类只有一个实例,并提供一个全局访问点来访问这个实例

单例设计模式的实现

  • 懒汉式:只有请求实例时才完成创建,需要使用了再创建;
  • 饿汉式:在类加载时,已经完成实例创建;

适用场景

  1. 资源共享;
  2. 只有一个实例;
  3. 懒加载:对象本身比较消耗资源,在整个程序中不一定会使用;

懒汉模式多线程安全

import threading
import sys
 
class shoppingcartmanager:
    __instance = None
    __lock = threading.Lock()
     
    def __init__(self):
        self.cart = {}

   ## 判断是否是唯一实例
    @classmethod
    def getInstance(cls):
        if cls.__instance is None:
            with cls.__lock:
                if cls.__instance is None:
                    cls.__instance = shoppingcartmanager()
        return cls.__instance

def main():
    cart_ins = shoppingcartmanager.getInstance()

饿汉模式

import sys
 
class ShoppingCartManager:
     
    __instance = None  # 静态变量,保存类的唯一实例
    ###懒汉模式 判断永远是唯一的instance
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super(ShoppingCartManager, cls).__new__(cls)
        return cls.__instance
 
    def __init__(self):
        self.cart = {}  # 初始化购物车的商品字典
     
    @classmethod
    def get_instance(cls):
        return cls.__instance
     
    def add_to_cart(self, key, value):
        self.cart[key] = self.cart.get(key, 0) + value
     
    def show_cart(self):
        for key, value in self.cart.items():
            print(f"{key} {value}")
 
# 在类加载时立即创建实例
ShoppingCartManager()
 
def main():
    cart_ins = ShoppingCartManager.get_instance()
    while True:
        line = sys.stdin.readline()
        if not line.strip():  # 结束条件
            break
        good_list = line.split()
        cart_ins.add_to_cart(good_list[0], int(good_list[1]))
    cart_ins.show_cart()
 
if __name__ == '__main__':
    main()

工厂方法模式

题目链接:https://kamacoder.com/problempage.php?pid=1076

  • 简单工厂模式
    • 创建型设计模式:将产品的创建过程封装在一个工厂类中,将创建对象的流程集中在工程类中
      • 主要角色:工厂类:创建产品、抽象产品:产品的各类接口、具体产品:实现抽象产品接口或继承抽象产品类;
  • 工厂方法模式
    • 抽象工厂:一个接口,包含一个抽象的工厂方法(用于创建产品对象);
    • 具体工厂:定义抽象接口,创建具体产品;
    • 抽象产品:定义产品接口;
    • 具体产品:实现抽象产品的接口,是工厂创建对象
  • 应用场景
    工厂方法模式使得每个工厂类的职责单一,每个工厂只负责创建一种产品,当创建对象涉及一系列复杂的初始化逻辑,而这些逻辑在不同的子类中可能有所不同时,可以使用工厂方法模式将这些初始化逻辑封装在子类的工厂中。在现有的工具、库中,工厂方法模式也有广泛的应用,比如:
    • Spring 框架中的 Bean 工厂:通过配置文件或注解,Spring 可以根据配置信息动态地创建和管理对象。
    • JDBC 中的 Connection 工厂:在 Java 数据库连接中,DriverManager 使用工厂方法模式来创建数据库连接。不同的数据库驱动(如 MySQL、PostgreSQL 等)都有对应的工厂来创建连接。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 抽象积木接口
interface Block {
    void produce();
}

// 具体圆形积木实现
class CircleBlock implements Block {
    @Override
    public void produce() {
        System.out.println("Circle Block");
    }
}

// 具体方形积木实现
class SquareBlock implements Block {
    @Override
    public void produce() {
        System.out.println("Square Block");
    }
}

// 抽象积木工厂接口
interface BlockFactory {
    Block createBlock();
}

// 具体圆形积木工厂实现
class CircleBlockFactory implements BlockFactory {
    @Override
    public Block createBlock() {
        return new CircleBlock();
    }
}

// 具体方形积木工厂实现
class SquareBlockFactory implements BlockFactory {
    @Override
    public Block createBlock() {
        return new SquareBlock();
    }
}

// 积木工厂系统
class BlockFactorySystem {
    private List<Block> blocks = new ArrayList<>();

    public void produceBlocks(BlockFactory factory, int quantity) {
        for (int i = 0; i < quantity; i++) {
            Block block = factory.createBlock();
            blocks.add(block);
            block.produce();
        }
    }

    public List<Block> getBlocks() {
        return blocks;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 创建积木工厂系统
        BlockFactorySystem factorySystem = new BlockFactorySystem();

        // 读取生产次数
        int productionCount = scanner.nextInt();
        scanner.nextLine();

        // 读取每次生产的积木类型和数量
        for (int i = 0; i < productionCount; i++) {
            String[] productionInfo = scanner.nextLine().split(" ");
            String blockType = productionInfo[0];
            int quantity = Integer.parseInt(productionInfo[1]);

            if (blockType.equals("Circle")) {
                factorySystem.produceBlocks(new CircleBlockFactory(), quantity);
            } else if (blockType.equals("Square")) {
                factorySystem.produceBlocks(new SquareBlockFactory(), quantity);
            }
        }
    }
}

抽象工厂

题目链接:https://kamacoder.com/problempage.php?pid=1077

在工厂方法模式中,每个具体工厂只负责创建单一的产品。但是如果有多类产品呢,比如说“手机”,一个品牌的手机有高端机、中低端机之分,这些具体的产品都需要建立一个单独的工厂类,但是它们都是相互关联的,都共同属于同一个品牌,这就可以使用到【抽象工厂模式】。

创建“多类”对象了,在工厂方法模式中,每个具体工厂只负责创建单一的产品。但是如果有多类产品呢,比如说“手机”,一个品牌的手机有高端机、中低端机之分,这些具体的产品都需要建立一个单独的工厂类,但是它们都是相互关联的,都共同属于同一个品牌,这就可以使用到【抽象工厂模式】。

  • 基本结构
    • 抽象产品接口
    • 具体产品类
    • 抽象工厂接口
    • 具体工厂类
import java.util.Scanner;

interface Chair{
    void showInfo();
}

class ModernChair implements Chair{
    @Override
    public void showInfo(){
        System.out.println("modern chair");
    }
}

class ClassicalChair implements Chair{
    @Override
    public void showInfo(){
        System.out.println("classical chair");
    }
}

interface Sofa{
    void displayInfo();
}

class ModernSofa implements Sofa{
    @Override
    public void displayInfo(){
        System.out.println("modern sofa");
    }
}

class ClassicalSofa implements Sofa{
    @Override
    public void displayInfo(){
        System.out.println("classical sofa");
    }
}

// 抽象家居工厂接口
interface FurnitureFactory {
    Chair createChair();
    Sofa createSofa();
}

class ModernFurnitureFactory implements FurnitureFactory{
    @Override
    public Chair createChair(){
        return new ModernChair();
    }
    @Override
    public Sofa createSofa(){
        return new ModernSofa();
    }
}

class ClassicalFurnitureFactory implements FurnitureFactory{
    @Override
    public Chair createChair(){
        return new ClassicalChair();
    }
    @Override
    public Sofa createSofa(){
        return new ClassicalSofa();
    }
}

public class Main {
    public static void main (String[] args) {
    /* code */
        Scanner scanner = new Scanner(System.in);
    
        int N = scanner.nextInt();
        
        for (int i=0;i<N;i++){
            String furnitureType = scanner.next();
            FurnitureFactory factory = null;
            if (furnitureType.equals("modern")){
                factory = new ModernFurnitureFactory(); 
            } else if (furnitureType.equals("classical")){
                factory = new ClassicalFurnitureFactory();
            }
            Chair chair = factory.createChair();
            Sofa sofa = factory.createSofa();
            
            chair.showInfo();
            sofa.displayInfo();
        }
        
    }
}

标签:__,模式,class,单例,工厂,new,设计模式,public,cls
From: https://www.cnblogs.com/P201821440041/p/18354724

相关文章

  • Flannel HOST-GW 模式
    FlannelUDP模式一、环境信息主机IPubuntu172.16.94.141软件版本docker26.1.4helmv3.15.0-rc.2kind0.18.0clab0.54.2kubernetes1.23.4ubuntuosUbuntu20.04.6LTSkernel5.11.5内核升级文档二、安装服务kind配置文件信......
  • C++单例模式
    当我们学习类的时候,有private、public、构造函数和析构函数等等,帮助我们应对不同的需求,以此来应对不同的设计问题。那么会存在以下一种情况,我们模拟一个国家政体,一个国家只能有一个总统。我们目前能创建多个对象的方法有,1.通过复制对象,2.实例化时创建多个对象,对于第一种我们可以......
  • 对象池模式,处理Boss的投射物攻击
    不使用对象池如果不使用对象池,那么假设一个Boss技能发射10个投射物,那么就会导致每次技能的释放需要创建10个投射物,然后遇到条件进行销毁对象池模式维护一个存储投射物的容器,然后在发射时从容器中取出,当"销毁时"放回容器中。实现方式以发射投射物为例,首先对于投射物创建一个......
  • Java jSerialComm库串口通信(USB RS-485/232) 查询/应答、主动上报模式
    JavajSerialComm库串口通信(USBRS-485/232)查询/应答、主动上报模式 查询/应答模式要在Java中通过USBRS-485接口发送和接收特定的数据帧,你需要利用适当的串行通信库。在Java中,一个常见的选择是使用RXTX或jSerialComm库。这些库允许Java应用程序与串行端口进行通信。......
  • 设计模式 - 装饰器模式
    ......
  • 设计模式 - 过滤器模式
    ......
  • 在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
    在Kubernetes(K8S)中,Flannel是一个广泛使用的容器网络接口(CNI)插件,它提供了一种简单而有效的方法来为集群中的每个容器分配网络,并确保它们可以互相通信。Flannel支持多种工作模式来实现数据报文的转发,其中最常见的是VXLAN、UDP和HOST-GW三种模式。1.Flannel的工作模式VXLAN模式:......
  • 简单工厂模式与工厂模式
    简单工厂模式的核心思想是将产品的创建过程封装在一个工厂类中,把创建对象的流程集中在这个工厂类里面。简单工厂模式包括三个主要角色,工厂类,抽象产品,具体产品。抽象产品:描述产品的通用行为。具体产品:实现抽象产品接口或者继承抽象产品类工厂类:负责创建产品,根据传递的不同参数......
  • 解密Java中介者模式:代码实例带你深入理解
    1.引言:中介者模式的重要性在软件设计的世界里,模块间的相互依赖往往会导致系统的复杂性和维护难度的增加。中介者模式(MediatorPattern)作为一种行为设计模式,它的出现就是为了解决这一问题。通过引入一个中介者对象,它能够协调各个模块之间的通信,从而实现模块间的解耦,提高系......
  • 【软件设计模式】策略模式详解
    策略模式策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。组成策略接口(Strategy):定义了一个所有具体策略的通用接口,各种不同的策略都遵循这个接口,它声明了一个上下文用于执行策略的方法......