1 定义
工厂方法模式,定义一个用户创建对象的接口,让继承接口的子类决定实例化某个类。工厂方法使一个类的实例化延迟到其子类。
2 工厂方法模式 VS 简单工厂模式
首先放一个我写的简单工厂模式的链接。简单工厂模式中工厂类包含了必要的逻辑,工厂类依据逻辑判断从而产生不同的类实例。但要加一个类实例的创建,我们需要修改简单工厂类的代码,增加逻辑判断,相当于我们开放了功能的扩展,又开放了代码的修改,违背的开闭原则。
工厂方法模式把逻辑判断转移到客户端中,在客户端中选择不同的工厂得到实例化对象。我们需要添加一个实例化对象的创建时,只需要增加一个继承创建实例化对象工厂接口的类。
工厂方法模式的缺点在于会增加很多类,如果有很多实例化对象,每个对象都需要一个工厂类来专门创建对应的对象,造成类的数量很多,增加管理难度。
3 工厂方法模式结构图
下图是工厂方法模式结构图(来自《大话设计模式》)。
4 代码示例
代码展示业务与简单工厂模式中业务相同,具体业务介绍请点击链接进行查看。
4.1 工厂方法需要创建的对象接口之Mapper
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-01 16:24
**/
public interface Mapper<T> {
/**
* 存储实体到数据库
*
* @param entity 存储的实体
*/
void saveEntity(T entity);
}
4.2 商户评论mapper
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-01 16:26
**/
public class MerchantCommentMapper implements Mapper<MerchantComment> {
@Override
public void saveEntity(MerchantComment merchantComment) {
System.out.println("存储的是审核商户回复内容," + merchantComment.getMerchantName());
}
}
4.3 用户评论mapper
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-01 16:26
**/
public class UserCommentMapper implements Mapper<UserComment> {
@Override
public void saveEntity(UserComment userComment) {
System.out.println("存储的是审核用户评论内容," + userComment.getUserName());
}
}
4.4 工厂方法需要创建的对象实例之CommonComment
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-01 16:28
**/
@Data
public class CommonComment {
private Integer id;
private String commentContent;
private String commentResult;
}
4.5 商户评论模型MerchantComment
@Data
public class MerchantComment extends CommonComment {
private String merchantName;
}
4.6 用户评论模型UserComment
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-01 16:29
**/
@Data
public class UserComment extends CommonComment {
private String userName;
}
4.7 创建Mapper的工厂接口MapperFactory
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-10 10:31
**/
public interface MapperFactory {
/**
* 创建mapper实例
* @return mapper实例
*/
Mapper createMapper();
}
4.8 创建用户评论mapper的工厂UserCommentMapperFactory
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-10 10:36
**/
public class UserCommentMapperFactory implements MapperFactory {
@Override
public Mapper createMapper() {
return new UserCommentMapper();
}
}
4.9 创建商户评论mapper的工厂MerchantCommentMapperFactory
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-10 10:34
**/
public class MerchantCommentMapperFactory implements MapperFactory {
@Override
public Mapper createMapper() {
return new MerchantCommentMapper();
}
}
4.10 创建评论模型实例的工厂接口CommentFactory
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-10 10:40
**/
public interface CommentFactory {
/**
* 创建评论对象实例
* @return 评论对象实例
*/
CommonComment createComment();
}
4.11 创建用户评论模型的工厂UserCommentFactory
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-10 10:42
**/
public class UserCommentFactory implements CommentFactory{
@Override
public CommonComment createComment() {
UserComment userComment = new UserComment();
userComment.setId(1);
userComment.setCommentContent("用户评论类容");
userComment.setCommentResult("用户评论审核结果");
userComment.setUserName("hello,我是用户评论");
return userComment;
}
}
4.12 创建商户评论模型的工厂MerchantCommentFactory
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-10 10:42
**/
public class MerchantCommentFactory implements CommentFactory{
@Override
public CommonComment createComment() {
MerchantComment merchantComment = new MerchantComment();
merchantComment.setId(1);
merchantComment.setCommentContent("商户评论类容");
merchantComment.setCommentResult("商户评论审核结果");
merchantComment.setMerchantName("hello,我是商户评论");
return merchantComment;
}
}
4.13 主程序
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-10 10:29
**/
public class MainClass {
public static void main(String[] args) {
boolean flag = true;
while (flag) {
//模拟接口参数
Scanner sc = new Scanner(System.in);
String identity = sc.nextLine();
if (identity.equals("exit")) {
System.out.println("退出系统");
flag = false;
} else {
//在客户端代码添加逻辑判断
if (identity.equals("user")){
Mapper mapper = new UserCommentMapperFactory().createMapper();
mapper.saveEntity(new UserCommentFactory().createComment());
}else if (identity.equals("merchant")){
Mapper mapper = new MerchantCommentMapperFactory().createMapper();
mapper.saveEntity(new MerchantCommentFactory().createComment());
}else {
System.out.println("身份标识参数输入错误");
continue;
}
}
}
}
}
4.14 运行结果
5 总结
前面介绍了工厂方法模式的定义与代码示例。从第四节代码示例可以看出,工厂方法多了很多创建类对象实例的工厂类,增加了管理难度。
6 引用
《大话设计模式》