(Factory Method)工厂方法模式的Java实现

简介:

工厂方法模式(Factory Method):定义一个用于创建对象的接口IFactory,在具体的ConcreteFactory子类中根据传进的参数即具体子类ConcreteProduct决定实例化哪一个IProduct产品,该模式使得一个类(即IProduct)的实例化延迟到其子类(即ConcreteProduct)。

通用类图如下:
代码实现如下:
   // 产品接口,定义一系列产品应该实现的服务,即产品的共性 
   interface IProduct { 
     public  void method01(); 
     public  void method02(); 
  } 
    
   // 具体的产品实现类 
   class ConcreteProductA  implements IProduct { 
     public  void method01() { 
      System.out.println( "ConcreteProductA method01() ..."); 
    } 
     public  void method02() { 
      System.out.println( "ConcreteProductA method02() ..."); 
    } 
  } 
    
   class ConcreteProductB  implements IProduct { 
     public  void method01() { 
      System.out.println( "ConcreteProductB method01() ..."); 
    } 
    
     public  void method02() { 
      System.out.println( "ConcreteProductB method02() ..."); 
    } 
  } 
    
   // 抽象的工厂类,定义了其子类必须实现的createProduct()方法 
   abstract  class Factory { 
     //运用了Java 中的泛型和反射技术 
     public  abstract <T  extends IProduct> T createProduct(Class<T> c); 
  } 
    
   class ConcreteFactory  extends Factory { 
     public <T  extends IProduct> T createProduct(Class<T> c) { 
      T product =  null
       try { 
        product = (T) Class.forName(c.getName()).newInstance(); 
      }  catch (Exception e) { 
        e.printStackTrace(); 
      } 
       return product; 
    } 
  } 
    
   public  class Client { 
     public  static  void main(String[] args) { 
       //创建一个具体工厂 
      Factory factory =  new ConcreteFactory(); 
       //根据参数中具体产品的.class名称来决定创建的产品类型 
      IProduct product01 = factory.createProduct(ConcreteProductA. class); 
      IProduct product02 = factory.createProduct(ConcreteProductB. class); 
        
      product01.method01(); 
      product01.method02(); 
      product02.method01(); 
      product02.method02(); 
    } 
}
实际上,具体的产品子类(即ConcreteProduct)可以有多个,以上只用了两个;而且具体的工厂(即ConcreteFactory)也可以有多个,不同的工厂可以提供不同的创建产品的实现方式,即使用不同的方式来覆盖实现父类中的抽象createProduct()方法。
我们可以将工厂方法模式中的产品理解为对外的服务,而IProduct接口仅仅只是制定一个标准,即每个产品(服务)必须对外提供的接口(这个“接口”是概念上的,不是上面那种编程语言级别的关键字interface“接口”)。
我们可以对上面这个工厂方法模式进行扩展。
1、例如,当我们并不需要创建一个工厂的时候(毕竟有时候我们可能只需要不多的几个产品而已),可以省略掉抽象的Factory类,直接设计一个具体的Factory类,由其提供一个静态方法来根据传进的参数进行适当的实例化操作,此时就变成了简单工厂模式了。
2、再者,我们可以根据需要设计不同的具体工厂类(即不同的ConcreteFactory类),此时让不同的具体工厂类ConcreteFactory与不同的产品类ConcreteProductl类一一对应,用不同的工厂来生产不同的产品(或者说不同的提供商来实现对外的不同服务)。修改一下类图即可,具体类图如下:
3、最后,可以使用工厂方法来实现对象实例化的延迟,这样做的好处是不必在某个产品还未被需要之前就创建出来,可以等到真正需要时再实例化并将其装进一个容器中,以备以后的访问需要,具体类图也只是将上面类图中的抽象Factory类与IProduct接口的依赖关系改成聚合关系即可,具体的代码实现也比较简单,这里不再给出。



本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/332576,如需转载请自行联系原作者
相关文章
|
2月前
|
传感器 人工智能 数据可视化
Java智慧工地监管一体化云平台APP源码 SaaS模式
安全隐患排查 1.可在电脑端、手机端对安全隐患数据进行记录、查询 2.能够实现安全隐患发起、整改、复查的闭环管理 3.具备对安全隐患数据进行统计、可视化分析、信息推送等功能 4.包含对危险性较大的分部分项工程进行巡查记录功能
62 4
|
3月前
|
消息中间件 Java
Java操作RabbitMQ单一生产-消费者模式
Java操作RabbitMQ单一生产-消费者模式
31 0
|
2天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
2天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
14天前
|
存储 Java
模式匹配魔法:Java 21中switch语句的巨大进化
模式匹配魔法:Java 21中switch语句的巨大进化
12 0
|
27天前
java.lang.IllegalArgumentException: Invalid character found in method name
java.lang.IllegalArgumentException: Invalid character found in method name
18 0
|
27天前
|
Java Maven Spring
SpringBoot运行出现 Lookup method resolution failed; nested exception is java.lang.IllegalStateException
SpringBoot运行出现 Lookup method resolution failed; nested exception is java.lang.IllegalStateException
38 0
|
1月前
|
传感器 人工智能 数据可视化
Java智慧工地监管一体化云平台APP源码 SaaS模式
高支模监测:高支模立杆及倾斜角度,高支模立杆的荷载,架体的水平位移以及模板沉降情况,当检测数据超过预警值时,实时报警。
32 2
|
1月前
|
Java
Java的模式
Java的模式
7 0
|
2月前
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
【2月更文挑战第6天】在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
22 3