设计模式-(单例,简单工厂,工厂,抽象工厂)

news/2025/2/25 17:56:02

单例模式

概念:

确保一个类只有一个实例,而且自行实例化并向震哥哥系统提供这个实例

应用:

无状态的,一般以工具类形式,进行提供

代码:

懒汉式,双重检查锁

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

备注:使用volatile修饰,是因为new Singleton()可以拆解为3步:

1、分配内存

2、初始化对象

3、指向刚分配的地址

若发生重排序,假设A线程执行了1和3,还没有执行2,B线程来到判断NULL时,不为NULL,B线程就会直接返回还没有初始化的instance了。volatile可以避免重排序

简单工厂模式

概念:

又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同,返回不同类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

应用:

不够灵活,新增产品需要修改工厂类;

优点在于实现对象的创建和使用分离

代码:
java">public class SimpleFactory {
    public static Product createProduct(String type){
        if (type.equals("A")){
            return new ProductA();
        } else {
            return new ProductB();
        }
    }

    public static void main(String[] args) {
        Product p = SimpleFactory.createProduct("A");
        p.print();
    }
}

abstract class Product{
    public abstract void print();
}

class ProductA extends Product{
    @Override
    public void print(){
        System.out.println("A");
    }

}

class ProductB extends Product{
    @Override
    public void print(){
        System.out.println("B");
    }
}

工厂模式

概念:

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

应用:

代码:
java">// 定义产品接口
interface Shape {
    void draw();
}

// 具体产品1
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

// 具体产品2
class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Square");
    }
}

// 定义工厂接口
interface ShapeFactory {
    Shape createShape();
}

// 具体工厂1
class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// 具体工厂2
class SquareFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Square();
    }
}

// 客户端代码
public class FactoryMethodDemo {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();

        ShapeFactory squareFactory = new SquareFactory();
        Shape square = squareFactory.createShape();
        square.draw();
    }
}

抽象工厂模式

概念:

一种更高级的工厂模式,用于创建相关或依赖对象的家族,而无需明确指定具体类

代码:
java">// 定义产品接口1
interface Shape {
    void draw();
}

// 定义产品接口2
interface Color {
    void fill();
}

// 具体产品1
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

// 具体产品2
class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Square");
    }
}

// 具体产品3
class RedColor implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with Red Color");
    }
}

// 具体产品4
class BlueColor implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with Blue Color");
    }
}

// 定义抽象工厂接口
interface AbstractFactory {
    Shape getShape(String shapeType);
    Color getColor(String colorType);
}

// 具体工厂1
class ShapeFactory implements AbstractFactory {
    @Override
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }

    @Override
    public Color getColor(String colorType) {
        return null;
    }
}

// 具体工厂2
class ColorFactory implements AbstractFactory {
    @Override
    public Shape getShape(String shapeType) {
        return null;
    }

    @Override
    public Color getColor(String colorType) {
        if (colorType == null) {
            return null;
        }
        if (colorType.equalsIgnoreCase("RED")) {
            return new RedColor();
        } else if (colorType.equalsIgnoreCase("BLUE")) {
            return new BlueColor();
        }
        return null;
    }
}

// 工厂生成器
class FactoryProducer {
    public static AbstractFactory getFactory(String choice) {
        if (choice == null) {
            return null;
        }
        if (choice.equalsIgnoreCase("SHAPE")) {
            return new ShapeFactory();
        } else if (choice.equalsIgnoreCase("COLOR")) {
            return new ColorFactory();
        }
        return null;
    }
}

// 客户端代码
public class AbstractFactoryDemo {
    public static void main(String[] args) {
        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        shape1.draw();

        Shape shape2 = shapeFactory.getShape("SQUARE");
        shape2.draw();

        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
        Color color1 = colorFactory.getColor("RED");
        color1.fill();

        Color color2 = colorFactory.getColor("BLUE");
        color2.fill();
    }
}


http://www.niftyadmin.cn/n/5865796.html

相关文章

FutureTask 和 CompletableFuture

FutureTask 和 CompletableFuture 是 Java 并发编程中用于处理异步任务的两种工具,但它们在功能和使用场景上有显著区别。以下是两者的主要对比: 1. FutureTask 定义:FutureTask 是 Future 接口的一个实现类,表示一个异步计算任务…

java23种设计模式-建造者模式

建造者模式(Builder Pattern)学习笔记 1. 模式定义 建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。 2. 适用场景 ✅ 需要创建包含多个…

2025年信息科学与工程学院科协机器学习介绍——机器学习基本模型介绍

机器学习 目录 机器学习一.安装基本环境conda/miniconda环境 二.数据操作数据预处理一维数组二维数组以及多维数组的认识访问元素的方法torch中tenson的应用张量的运算张量的广播 三.线性代数相关知识四.线性回归SoftMax回归问题(分类问题)什么是分类问题…

利用python和gpt写一个conda环境可视化管理工具

最近在学习python,由于不同的版本之间的差距较大,如果是用环境变量来配置python的话,会需要来回改,于是请教得知可以用conda来管理,但是conda在管理的时候老是要输入命令,感觉也很烦,于是让gpt帮…

C++ 继承与运算符重载的简单练习

1.长方形的继承类 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std; class AB{ private:int a;int …

【odoo18-文件管理】在uniapp上访问odoo系统上的图片

在uniapp上访问odoo系统上的图片 1、以url的形式访问 a&#xff1a;以odoo本身的域名&#xff0c;比如http://127.0.0.1:8069/web/image/product.template/3/image_128?unique1740380422000&#xff0c;这种方式需要解决跨域的问题。 b&#xff1a;以文件服务器的形式&…

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…

蓝桥杯备赛-迷宫-BFS

这是一个关于二维迷宫的题目。我们要从迷宫的起点 S 走到终点 E&#xff0c;每一步我们只能选择上下左右四个方向中的一个前进一格。 W 代表墙壁&#xff0c;是不能进入的位置&#xff0c;除了墙壁以外的地方都可以走。迷宫内的 D 代表一道上锁的门&#xff0c;只有在持有钥匙的…