工厂设计模式
简介
工厂模式
是一种创建型设计模式
,用于创建产品
,代替手动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) {
// ...
}
}
- 优点:
- 保证客户始终使用同一个产品族
- 符合开闭原则,新增产品族时只需新增工厂类,无需修改原有代码
- 缺点:
- 新增抽象产品时,需要修改抽象工厂以及所有的具体工厂,违反开闭原则