本文章主要是对Java23种设计模式种的工厂模式进行总结。工厂,顾名思义,就是创建批量化操作的大的工厂。而今天我们也可以利用现实生活中的工厂思维,来理解设计模式的工厂模式。
设计模式之工厂模式共有三种形态:
简单的工厂模式(静态工厂模式),工厂方法模式(多态性工厂或者虚拟构造子模式)、抽象工厂模式(工具箱模式)
简单的工厂模式
所谓的简单工厂模式,所涉及到的有工厂角色、抽象产品角色以及具体产品角色等三个角色
工厂类:担任角色的是工厂方法模式的核心,含有与应用紧密相关的具体业务逻辑。工厂类在客户端的直接调用下创建产品对象,它往往是由一个具体的Java类来实现的
抽象产品:是工厂方法模式所创建的对象的父类,或者是他们共同拥有的接口,抽象产品角色可以用一个Java接口或者抽象类来实现
具体产品:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色也是由一个Java类实现的。
下面是一个简单的小栗子,首先工厂是厨房,抽象类是笼统的菜,实现类就是具体哪个菜。
抽象产品
/**
* 抽象类角色:food接口,约束类型
*/
public interface IFood {
/**
* 提供一个展示食物细节的方法
* @param foodName 食物名称
*/
public void showFood();
}
具体产品-鱼、土豆丝
/**
* 具体食物:土豆丝
*/
public class ShreddedPotatoesFood implements IFood{
@Override
public void showFood() {
System.out.println("一盘土豆丝");
}
}
/**
* 具体产品-食物鱼
*/
public class FishFood implements IFood
{
@Override
public void showFood() {
System.out.println("一盘鱼");
}
}
工厂角色
/**
* 工厂角色-食物工厂
*/
public class SimpleFoodFactory {
/**
* 提供一个静态方法,用于获取食物
* @param foodType 食物类型
* @return 具体食物
*/
public static IFood getFood(String foodType){
IFood food = null;
if (foodType.equals("fish")) {
food = new FishFood();
}
if (foodType.equals("potatoes")) {
food = new ShreddedPotatoesFood();
}
return food;
}
}
客户端
/**
* 客户端
*/
public class MainTest {
public static void main(String[] args) {
IFood fishfood = SimpleFoodFactory.getFood("fish");
fishfood.showFood();
IFood potatoesfood = SimpleFoodFactory.getFood("potatoes");
potatoesfood.showFood();
}
}
通过分析整个简单工厂模式,我们不难发现:
该模式的核心在于工厂角色,也就是SimpleFoddFacotry类,这个类包含了必要的判断逻辑,可以决定什么时候需要创建什么对象。而此时的客户端的操作就只有工厂类的身影。所以,用一句话来概括这一优势,就是简单工厂模式实现了对责任的分割。
但同时该方法也存在一定的缺陷,对于担任工厂角色的工厂类的就显得尤为吃力,无论是在维护后期的扩展还是维护。