设计模式入门:简单工厂

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

场景:在一个管理系统中,有三种用户:管理员,一般用户,匿名用户。为了维护方便,该系统运行在维护时使用临时用户,所以需要一个可以创建三种类型的临时用户的功能。这里就可以使用简单工厂来创建临时用户,并进行相应初始化。

设计

这里写图片描述

构成

  • 工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。(SimpleFactory)
  • 抽象产品(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。(User)
  • 具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。(AdminUser,AnonymousUser,NormalUser)

实现

代码地址:https://github.com/telundusiji/designpattern

抽象产品 User

@Data
public abstract class User {
    private String name;
    private String role;

    public abstract void init();
}

具体产品 管理员临时用户

public class AdminUser extends User {
    @Override
    public void init() {
        setName("临时用户:张三");
        setRole("管理员");
    }
}

具体产品 匿名临时用户

public class AnonymousUser extends User {
    @Override
    public void init() {
        setName("临时用户:XX");
        setRole("匿名用户");
    }
}

具体产品 一般临时用户

public class NormalUser extends User {
    @Override
    public void init() {
        setName("临时用户:李四");
        setRole("一般");
    }
}

工厂

public class SimpleFactory {
    public enum Type{
        ADMIN{
            protected User getUser(){
                return new AdminUser();
            }
        },
        NORMAL{
            protected User getUser(){
               return new NormalUser();
            }
        },
        ANONYMOUS{
            protected User getUser(){
                return new AnonymousUser();
            }
        };
        protected User getUser(){
            return null;
        }
    }

    public static <T> T createUser(Type type,Class<T> tClass){
        User user = type.getUser();
        user.init();
        return (T)user;
    }
}

优缺点

优点:

  • 工厂类包含了真个类创建的逻辑,外界仅仅需要负责“消费”对象就可以了,而不必管创建及组织过程,明确了各自的职责和权利

缺点:

  • 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,所以如果需要添加新的类,则就需要改变工厂类了。
  • 当系统中的具体产品类增多,工厂类的创建实例的逻辑会变得复杂,对系统的维护和扩展非常不利;

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值