设计模式-简单工厂

简单工厂模式

传入参数,创建属于同一父类下的不同子类实例。

定义一个父类(通常是抽象的),再定义一些基于父类的具体子类,然后定义一个工厂类,包含了一个用于创建各个不同子类的静态方法,它根据传入的参数来判断应该创建那个子类实例。

简单工厂中,存在3个角色:

  • 抽象产品
  • 具体产品
  • 简单工厂

简单工厂下的角色划分

User抽象父类

copy
package com.example.ezfactory.pojo; import java.util.Arrays; public abstract class User { String id; String name; int[] permissions; // 权限数组: 1-查看,2-进入,3-管理,4-裁决 public User(String name) { this.name = name; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", permissions=" + Arrays.toString(permissions) + '}'; } }

Client客户子类

copy
package com.example.ezfactory.pojo; import java.util.UUID; public class Client extends User { public Client(String name) { super(name); this.id = "c-".concat(UUID.randomUUID().toString()); //id以'c-'开头 this.permissions = new int[]{1}; //拥有权限1(查看) } }

Employee员工子类

copy
package com.example.ezfactory.pojo; import java.util.UUID; public class Employee extends User{ public Employee(String name) { super(name); this.id = "e-".concat(UUID.randomUUID().toString()); //id以'e-'开头 this.permissions = new int[]{1,2}; //拥有权限1(查看)和权限2(进入) } }

还有Manager(管理)和Boss(老板)以此类推

UserFactory简单工厂类

定义了一个静态方法:传入2个参数,一个指定User的类型,一个指定User实例对象的名字,并生成相应的实例对象

copy
package com.example.ezfactory; import com.example.ezfactory.pojo.*; public class UserFactory { public static User getUser(String type, String name){ switch (type){ case "client":{ return new Client(name); } case "empolyee":{ return new Employee(name); } case "manager":{ return new Manager(name); } case "boss":{ return new Boss(name); } default:{ return null; } } } }

测试

Main.java

copy
package com.example.ezfactory; import com.example.ezfactory.pojo.User; public class Main { public static void main(String[] args) { User user = UserFactory.getUser("boss","老板"); System.out.println(user.toString()); } }

把"boss"换成其他试试。

简单工厂的优点

★ 实现了责任的分割
★ 客户端可以不用知道具体产品的类名,只需要掌握基本的参数就行

简单工厂的缺点

★ 工厂类出问题,整个模块受牵连
★ 需要维护很多子类
★ 由于是静态工厂方法,如果父类有静态方法,子类将无法覆盖静态方法

应用场景

客户不关系具体的对象类名和创建细节,只需要初始参数,并且所需要创建的类不太多。

posted @   Evanpatchouli  阅读(18)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起