现实生活中,原始社会自给自足(没有工厂)
农耕社会小作坊(简单工厂,民间酒坊)
工业革命流水线(工厂方法,自产自销)
现代产业链代工厂(抽象工厂,富士康)
工厂模式的定义:
定义一个创建对象的工厂接口,将对象的实际创建工作扔到具体子工厂类中。满足了创建型模式中所要求的“创建与使用相分离”的特点
简单工厂模式定义
简单工厂中创建对象的方法一般为静态方法,所以简单工厂又叫静态工厂方法模式(Static Factory Method Pattern)
通俗的说,简单工厂模式有一个具体的工厂类,可以生产不同的产品。
但是该模式每增加一种产品就要增加一个具体产品类和一个对应的具体工厂类,违背开闭原则。
优点:
1. 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责。工厂和产品的职责区分明确
2. 客户端不需要知道创建的产品的类名,只需要知道参数即可
3. 可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类
缺点:
1. 简单工厂模式的工厂单一,职责过重。且代码会很臃肿,违背高聚合原则
2. 会增加系统中工厂类的个数,复杂度增加
3. 拓展困难,因为简单工厂使用了static工厂方法,无法形成基于继承的等级结构
应用场景:
对于产品种类较少的情况使用简单工厂模式。
模式结构:
1. 简单工厂(SimpleFactory):负责实现创建所有实例的内部逻辑。创建对象的方法可以被外界直接调用
2. 抽象产品(Product):简单工厂创建的对象的父类,负责描述所有实例的共有的公共接口
3. 具体产品(ConcreteProduct):简单工厂的创建目标
实现:
/**
* @Author: KenChen
* @Description: 简单工厂模式示例
* @Date: Create in 2022/5/11 17:52
*/
public class Client {
public static void main(String[] args) {
Product product1 = SimpleFactory.makeProduct(Const.PRODUCT_A);
Product product2 = SimpleFactory.makeProduct(Const.PRODUCT_B);
product1.show();
product2.show();
}
// 抽象产品
public interface Product {
void show();
}
// 具体产品类
static class ConcreteProduct1 implements Product {
@Override
public void show() {
System.out.println("具体产品1");
}
}
static class ConcreteProduct2 implements Product {
@Override
public void show() {
System.out.println("具体产品2");
}
}
final class Const{
static final int PRODUCT_A = 1;
static final int PRODUCT_B = 2;
}
// 工厂类
static class SimpleFactory{
public static Product makeProduct(int kind){
switch (kind){
case 1:
return new ConcreteProduct1();
case 2:
return new ConcreteProduct2();
default:
break;
}
return null;
}
}
}