个人公众号【爱做梦的锤子】,全网同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,欢迎关注,里面会分享更多有用知识,还有我的私密照片