一聚教程网:一个值得你收藏的教程网站

热门教程

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

时间:2022-06-29 02:55:37 编辑:袖梨 来源:一聚教程网

类型: 对象创建型模式

意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。

适用性:

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

结构:

123941.png

参与者:

Product(Document)
— 定义工厂方法所创建的对象的接口。
• ConcreteProduct(MyDocument)
— 实现Product接口。
• Creator(Application)
— 声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方
法的缺省实现,它返回一个缺省的 ConcreteProduct对象。
— 可以调用工厂方法以创建一个 Product对象。
• ConcreteCreator(MyApplication)
— 重定义工厂方法以返回一个 ConcreteProduct实例。

例子

factory_method.png

注释:在实际的代码中,我添加了几个Account的接口。工厂方法为:getAccount()

 代码如下 复制代码

Account.java

package com.raysmond.factorymethod;

public interface Account {
 //定义工厂方法创建的对象的接口
 public RoleType getRole();
 public void setAccountId(Integer accountId);
 public Integer getAccountId();
 public void setAccountName(String name);
 public String getAccountName();
}
User.java

package com.raysmond.factorymethod;

public class User implements Account{
 private Integer userId;
 private String userName;

 @Override
 public RoleType getRole() {
  return RoleType.USER;
 }
 
 @Override
 public void setAccountId(Integer accountId) {
  this.userId = accountId;
 }

 @Override
 public Integer getAccountId() {
  return userId;
 }

 @Override
 public void setAccountName(String name) {
  this.userName = name;
 }

 @Override
 public String getAccountName() {
  return userName;
 }

 
}
Admin.java

package com.raysmond.factorymethod;

public class Admin implements Account{
 private Integer adminId;
 private String adminName;
 
 @Override
 public RoleType getRole() {
  return RoleType.ADMIN;
 }
 
 @Override
 public void setAccountId(Integer accountId) {
  this.adminId = accountId;
 }
 
 @Override
 public Integer getAccountId() {
  return adminId;
 }

 @Override
 public void setAccountName(String name) {
  this.adminName = name;
 }
 @Override
 public String getAccountName() {
  return adminName;
 }

}
AccountFactory.java

package com.raysmond.factorymethod;

public interface AccountFactory {
 Account getAccount();
}
UserFactory.java

package com.raysmond.factorymethod;

public class UserFactory implements AccountFactory{

 @Override
 public Account getAccount() {
  return new User();
 }

}
AdminFactory.java

package com.raysmond.factorymethod;

public class AdminFactory implements AccountFactory{

 @Override
 public Account getAccount() {
  return new Admin();
 }

}
RoleType.java

package com.raysmond.factorymethod;

public enum RoleType {
 ADMIN,USER
}
Test.java

package com.raysmond.factorymethod;

public class Test {
 public static void main(String[] args){
  AccountFactory userFactory = new UserFactory();
  User user = (User) userFactory.getAccount();
  
  AccountFactory adminFactory = new AdminFactory();
  Admin admin = (Admin) adminFactory.getAccount();
  
  System.out.println(user.getRole());
  System.out.println(admin.getRole());
 }
}

热门栏目