定义
定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象,使一个产品类的实例化延迟到其工厂的子类。
UML图

示例代码
java
package com.sumlv.demo;
import com.sumlv.demo.factory.ProductFactory;
import com.sumlv.demo.factory.ProductFactoryMap;
import com.sumlv.demo.product.Product;
/**
* 客户端
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public class Client {
public static void main( String[] args ) {
ProductFactory factory = ProductFactoryMap.getProductFactory(args[0]);
Product product = factory.getInstance();
Object result = product.execute(args[2]);
System.out.println(result);
}
}
java
package com.sumlv.demo.factory;
import com.sumlv.demo.factory.impl.SubProduct1Factory;
import com.sumlv.demo.factory.impl.SubProduct2Factory;
import java.util.HashMap;
import java.util.Map;
/**
* 产品工厂映射
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public class ProductFactoryMap {
/**
* 工厂映射
*/
private static final Map<String, ProductFactory> FACTORY_MAP = new HashMap<>();
static {
FACTORY_MAP.put("1", new SubProduct1Factory());
FACTORY_MAP.put("2", new SubProduct2Factory());
}
/**
* 根据key获取对应工厂实例
*
* @param key key
* @return 工厂实例
*/
public static ProductFactory getProductFactory(String key) {
return FACTORY_MAP.get(key);
}
private ProductFactoryMap() {
throw new RuntimeException();
}
}
java
package com.sumlv.demo.factory;
import com.sumlv.demo.product.Product;
/**
* 产品工厂
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public interface ProductFactory {
/**
* 获取产品实例
*
* @return 产品实例
*/
Product getInstance();
}
java
package com.sumlv.demo.factory.impl;
import com.sumlv.demo.factory.ProductFactory;
import com.sumlv.demo.product.Product;
import com.sumlv.demo.product.impl.SubProduce2;
/**
* 子产品1工厂
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public class SubProduct1Factory implements ProductFactory {
@Override
public Product getInstance() {
return new SubProduce1();
}
}
java
package com.sumlv.demo.factory.impl;
import com.sumlv.demo.factory.ProductFactory;
import com.sumlv.demo.product.Product;
import com.sumlv.demo.product.impl.SubProduce2;
/**
* 子产品2工厂
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public class SubProduct2Factory implements ProductFactory {
@Override
public Product getInstance() {
return new SubProduce2();
}
}
java
package com.sumlv.demo.product;
/**
* 产品接口
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public interface Product {
/**
* 业务逻辑
*
* @param param 方法参数
* @return 执行结果
*/
Object execute(Object param);
}
java
package com.sumlv.demo.product.impl;
import com.sumlv.demo.product.Product;
/**
* 子产品1
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public class SubProduce1 implements Product {
@Override
public Object execute(Object param) {
// 子产品1执行逻辑。。。
return new Object();
}
}
java
package com.sumlv.demo.product.impl;
import com.sumlv.demo.product.Product;
/**
* 子产品2
*
* @Auther: yuzhuo.song
* @Date: 2026-02-25
*/
public class SubProduce2 implements Product {
@Override
public Object execute(Object param) {
// 子产品2执行逻辑。。。
return new Object();
}
}
优缺点分析
优点:
-
用户仅需知道工厂名称即可获取想要的产品实例,无需关注产品本身的创建过程;
-
当产品需要拓展时,只需在产品接口和工厂接口下分别拓展对应子类实现即可,无需对已有代码进行修改,符合开闭原则。
缺点:
- 每增加一个产品就必须添加一个工厂类和一个产品类,会增加系统的复杂度。