抽象工厂及其改进示例

本文将用反射机制和配置文件改进抽象工厂
抽象工厂示例
结构如下所示:
在这里插入图片描述

AbstractComputer,AbstractDisplay相似,他们都为抽象产品类。

public class AbstractComputer {
  protected String manufacturerName="";
protected String modelName="";
  public String showDetails(){
    return "生产商为 "+manufacturerName+"型号为 "+modelName;
  }
}

AppleComputer,DellComputer类继承了AbstractComputer,实现具体的产品。对于显示器类型的抽象产品与具体产品的关系相似,代码如下:

public class AppleComputer extends AbstractComputer{
  protected String manufacturerName="APPLE";
  protected String modelName="Q1";
  public String showDetails(){
    return "生产商为 "+manufacturerName+"型号为 "+modelName;
  }
}

DeviceFactory为抽象工厂类,包含多个创建产品的方法,可以创建Computer等不同类型族的产品。

public abstract class DeviceFactory {
//  创造一台电脑
  abstract public AbstractComputer CreateComputer();
//  创造一台显示器
  abstract public AbstractDisplay CreateDisplay();
}

AppleFactory继承了DeviceFactory,实现抽象工厂中的多个抽象方法,完成具体产品的创建。DellFactory相似。

public class AppleFactory extends DeviceFactory {
  public AbstractComputer CreateComputer(){
    return  new AppleComputer();
  }
  public AbstractDisplay
  CreateDisplay(){
    return  new AppleDisplay();
  }
}

Test客户端

public class Test {
  public static void main(String[] args) {
      AbstractComputer myPC;
      AbstractDisplay myDisplay;
      DeviceFactory factory=new DellFactory();
//    DeviceFactory factory=new AppleFactory();
    myPC=factory.CreateComputer();
      myDisplay=factory.CreateDisplay();
System.out.println("电脑:"+myPC.showDetails());
System.out.println("显示器:"+myDisplay.showDetails());

  }
}

uml如图所示:
在这里插入图片描述


接下来使用反射机制加配置文件改进该抽象工厂示例。
结构中引入配置文件,删去所有的工厂,只留下DeviceFactory,其他类保持不变。
在这里插入图片描述
配置文件Device.properties

#DeviceComputer=AppleComputer
#DeviceDisplay=AppleDisplay

DeviceComputer=DellComputer
DeviceDisplay=DellDisplay

工厂DeviceFactory

public class DeviceFactory {

  public static Properties properties = new Properties();
  public static File file = new File("src\\Device.properties");
    public static AbstractComputer CreateComputer() throws Exception{
      properties.load(new FileInputStream(file));
      return (AbstractComputer)Class.forName(properties.getProperty("DeviceComputer")).newInstance();
    };
  public static AbstractDisplay CreateDisplay() throws Exception{
    return (AbstractDisplay)Class.forName(properties.getProperty("DeviceDisplay")).newInstance();
  };
}

Test客户端

public class Test {
  public static void main(String[] args) throws Exception {
     AbstractComputer myPC;
      AbstractDisplay myDisplay;
      myPC=DeviceFactory.CreateComputer();
      myDisplay=DeviceFactory.CreateDisplay();
    System.out.println("电脑:"+myPC.showDetails());
    System.out.println("显示器:"+myDisplay.showDetails());
  }
}

uml类图:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值