工厂设计模式

工厂设计模式

简介

工厂模式是一种创建型设计模式,用于创建产品,代替手动new,主要包括简单工厂模式、工厂方法模式、抽象工厂模式。

一、简单工厂模式

定义 :通过一个工厂类根据传入的参数匹配创建的产品

结构组成:

  • 工厂(Factory):负责创建具体产品
  • 抽象产品(Product):定义产品的标准
  • 具体产品(Concret Product):抽象产品的具体产品

案例

抽象产品

java 复制代码
//	水果
public interface Fruit {
    
    String name();
}

具体产品

java 复制代码
//	苹果
public class Apple implements Fruit{

    public String name() {
        return "Apple";
    }
}
//	香蕉
public class Banana implements Fruit{

    public String name() {
        return "Banana";
    }
}

工厂

java 复制代码
//	水果加工厂
public class FruitFactory {

    public static Fruit createFruit(String name) {
        // 根据产品名称创建产品
        if ("apple".equals(name)) {
            return new Apple();
        } else if ("banana".equals(name)) {
            return new Banana();
        }
        return null;
    }
}
  • 优点:客户只需要知道参数就能拿到具体产品

  • 缺点:工厂的职责过重,新增产品时需要修改工厂源码,违反开闭原则

二、工厂方法模式

定义 :定义工厂标准,存在多个工厂,一个工厂生产一种产品,遵循单一职责原则。

结构组成:

  • 抽象工厂(Factory):声明工厂方法,返回抽象产品
  • 具体工厂(Concret Factory):用于创建具体产品
  • 抽象产品(Product):定义产品标准
  • 具体产品(Concret Product):抽象产品的具体实现

案例

抽象产品

java 复制代码
public interface Fruit {
    String name();
}

具体产品

java 复制代码
public class Apple implements Fruit {
    public String name() {
        return "Apple";
    }
}
public class Banana implements Fruit {
    public String name() {
        return "Banana";
    }
}

抽象工厂

java 复制代码
public interface FruitFactory {
    Fruit createFruit();
}

具体工厂

java 复制代码
public class AppleFactory implements FruitFactory{
    public Fruit createFruit() {
        return new Apple();
    }
}
public class BananaFactory implements FruitFactory{
    public Fruit createFruit() {
        return new Banana();
    }
}
  • 优点:
    • 符合开闭原则,新增产品时只需要新增工厂类,无需修改现有代码
    • 客户只需通过具体工厂就能创建对应产品
  • 缺点:
    • 每新增一个产品就要新创建一个工厂类,类的数量会增加

三、抽象工厂模式

定义 :具体工厂生产多种抽象产品,一个工厂生产出的不同产品属于一个产品族

结构组成:

  • 抽象工厂:声明一系列创建产品的方法
  • 具体工厂:用于创建一系列产品的工厂
  • 抽象产品:定义产品的标准
  • 具体产品:抽象产品的具体实现

抽象工厂模式针对的是产品族,一个具体工厂可以生成多种产品,而简单工厂和工厂方法模式只针对一种抽象产品

案例

抽象产品

java 复制代码
public interface Fruit {	//	水果
    String name();
}
public interface Vegetable {	//	蔬菜
    String name();
}

具体产品

java 复制代码
//	具体水果
public class Apple implements Fruit {
    public String name() {return "Apple";}
}
public class Banana implements Fruit {
    public String name() {return "Banana";}
}

//	具体蔬菜
public class Cabbage implements Vegetable{
    public String name() {return "白菜";}
}
public class Tomato implements Vegetable{
    public String name() { return "西红柿";}
}

抽象工厂

java 复制代码
public interface FoodFactory {
	//	创建水果
    Fruit createFruit(String name);
	//	创建蔬菜
    Vegetable createVegetable(String name);
}

具体工厂

java 复制代码
//	小米加工厂
public class XiaomiFactory implements FoodFactory {
    //	小米加工厂生产出的产品全是小米族
    public Fruit createFruit(String name) {
        if ("apple".equals(name)) {
            return new Apple();
        } else if ("banana".equals(name)) {
            return new Banana();
        }
        return null;
    }
    public Vegetable createVegetable(String name) {
        if ("cabbage".equals(name)) {
            return new Cabbage();
        } else if ("tomato".equals(name)) {
            return new Tomato();
        }
        return null;
    }
}
//	Alibaba加工厂
public class AlibabaFactory implements FoodFactory {
    public Fruit createFruit(String name) { 
        // ... 
    }
    public Vegetable createVegetable(String name) {
       // ...
    }
}
  • 优点:
    • 保证客户始终使用同一个产品族
    • 符合开闭原则,新增产品族时只需新增工厂类,无需修改原有代码
  • 缺点:
    • 新增抽象产品时,需要修改抽象工厂以及所有的具体工厂,违反开闭原则
相关推荐
懂点Tech20 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
comedate20 小时前
SMLib 的 Examples 导读:PyAPI / SM_API / SMLib 三组示例怎么读
python·cad·smlib·examples·sm_api
云和数据.ChenGuang21 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠21 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
川石课堂软件测试21 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
万化冥合1 天前
PyBox屏幕键盘如何辅助演示键盘操作?
python·计算机外设
车软学堂1 天前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
天空依然蔚蓝1 天前
分享一个自动检测网站在线状态的python程序
python·运维开发·1024程序员节
岁月宁静1 天前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
codists1 天前
《crafting interpreters》阅读笔记:p45-p45
python