工厂设计模式

工厂设计模式

简介

工厂模式是一种创建型设计模式,用于创建产品,代替手动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) {
       // ...
    }
}
  • 优点:
    • 保证客户始终使用同一个产品族
    • 符合开闭原则,新增产品族时只需新增工厂类,无需修改原有代码
  • 缺点:
    • 新增抽象产品时,需要修改抽象工厂以及所有的具体工厂,违反开闭原则
相关推荐
2401_871696523 分钟前
如何保证MongoDB文档的数据质量_JSON Schema验证规则配置
jvm·数据库·python
SimonKing5 分钟前
国产开源富文本编辑器 wangEditor,本姓编辑器
java·后端·程序员
z4424753265 分钟前
SQL利用JOIN实现数据关联分析的实操_关联维度表补全信息
jvm·数据库·python
剑飞的编程思维7 分钟前
系统架构评审报告(正式交付模板)
java·系统架构
maqr_1108 分钟前
SQL如何快速提取分组中最晚时间点数据_结合窗口函数实现
jvm·数据库·python
Shorasul8 分钟前
mysql如何限制特定表的最大存储空间_通过ALTER TABLE设置MAX_ROWS
jvm·数据库·python
21439658 分钟前
如何存储MongoDB的爬虫抓取数据_动态字段与无模式宽容度.txt
jvm·数据库·python
m0_748920368 分钟前
CSS如何实现网格内绝对定位_利用Grid的relative属性层级控制
jvm·数据库·python
qq_342295829 分钟前
golang如何优化磁盘IO性能_golang磁盘IO性能优化思路
jvm·数据库·python
weixin_424999369 分钟前
MySQL中如何使用CAST实现类型转换_MySQL数据类型转换技巧
jvm·数据库·python