设计模式---工厂方法(Factory Method)模式

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 引用

《大话设计模式》

7 源代码

design-pattern-learning/src/com/hz/design/pattern/factory/method at main · airhonor/design-pattern-learning · GitHub

猜你喜欢

转载自blog.csdn.net/honor_zhang/article/details/120217725