设计模式-工厂设计模式

工厂设计模式是一种创建型设计模式,有简单工厂模式,工厂设计模式,抽象工厂模式

其中使用最多的是工厂设计模式,其次是抽象工厂模式,简单工厂模式因为其扩展性较差,而且工厂设计模式是简单工厂模式的升级,简单设计模式存在的意义就是更好的理解工厂设计模式

复制代码
// 产品接口
interface Product {
    void use();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void use() {
        System.out.println("Using ConcreteProductA");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    public void use() {
        System.out.println("Using ConcreteProductB");
    }
}

简单工厂模式;

1.只需要对工厂传入一个参数,工厂就能返回该产品类的实例

2.违背了开闭原则,每次增加一个新的产品类时,就需要修改工厂类的逻辑

代码示例:

复制代码
// 简单工厂
class SimpleFactory {
    public Product createProduct(String type) {
        if (type == null) {
            return null;
        }
        if (type.equalsIgnoreCase("A")) {
            return new ConcreteProductA();
        } else if (type.equalsIgnoreCase("B")) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 客户端代码
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        Product productA = factory.createProduct("A");
        productA.use();
        
        Product productB = factory.createProduct("B");
        productB.use();
    }
}

工厂设计模式:

1.将具体工厂分离出来,单独写成一个类来实现共同的工厂接口

2.符合开闭原则,需要添加新的工厂时,只需要写一个新的工厂类实现工厂接口,无需修改原有代码

3.泛用性最强,使用最多的工厂设计模式

4.无法解决多维度问题,比如同一个产品但是不同厂商,像是华为的手机和小米的手机,都是手机,但是要用工厂设计模式要写两个工厂类,目前还没问题,但是一旦产品多了起来,华为的有手机,笔记本,小米的有吹风机,手机,笔记本,这就是五个工厂,两个手机厂,两个电脑厂,一个吹风机厂,随着产品越来越多,扩展也越多,这就会导致代码堆叠的毫无章法.

代码示例

复制代码
// 工厂接口
interface Factory {
    Product createProduct();
}

// 具体工厂A
class ConcreteFactoryA implements Factory {
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂B
class ConcreteFactoryB implements Factory {
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class FactoryMethodDemo {
    public static void main(String[] args) {
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.use();
        
        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.use();
    }
}

抽象工厂设计模式:

1.最顶层的工厂提供了创建一系列的相关对象的接口;

2.每个具体工厂实现了该接口,并创建了具体的产品

3.遵循开闭原则

复制代码
// 抽象工厂
interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }
    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }
    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}

// 客户端代码
public class AbstractFactoryDemo {
    public static void main(String[] args) {
        AbstractFactory factory1 = new ConcreteFactory1();
        ProductA productA1 = factory1.createProductA();
        ProductB productB1 = factory1.createProductB();
        productA1.use();
        productB1.use();
        
        AbstractFactory factory2 = new ConcreteFactory2();
        ProductA productA2 = factory2.createProductA();
        ProductB productB2 = factory2.createProductB();
        productA2.use();
        productB2.use();
    }
}
相关推荐
好家伙VCC37 分钟前
【无标题】
java
十八旬1 小时前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude
前进的李工1 小时前
EXPLAIN输出格式全解析:JSON、TREE与可视化
开发语言·数据库·mysql·性能优化·explain
小碗羊肉1 小时前
【JavaWeb | 第十一篇】文件上传(本地&阿里云OSS)
java·阿里云·servlet
吾疾唯君医1 小时前
Java SpringBoot集成积木报表实操记录
java·spring boot·spring·导出excel·积木报表·数据文件下载
Byron Loong2 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
独隅2 小时前
CodeX + Visual Studio Code 联动的全面指南
开发语言·php
坚果派·白晓明2 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
hexu_blog2 小时前
vue+java实现图片批量压缩
java·前端·vue.js
头歌实践平台2 小时前
Hadoop开发环境搭建
java·大数据·hadoop