(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,如需转载请自行联系原作者
相关文章
|
4月前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
85 11
|
5月前
|
消息中间件 Java
【实战揭秘】如何运用Java发布-订阅模式,打造高效响应式天气预报App?
【8月更文挑战第30天】发布-订阅模式是一种消息通信模型,发送者将消息发布到公共队列,接收者自行订阅并处理。此模式降低了对象间的耦合度,使系统更灵活、可扩展。例如,在天气预报应用中,`WeatherEventPublisher` 类作为发布者收集天气数据并通知订阅者(如 `TemperatureDisplay` 和 `HumidityDisplay`),实现组件间的解耦和动态更新。这种方式适用于事件驱动的应用,提高了系统的扩展性和可维护性。
84 2
|
4月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
5月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
5月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
4月前
|
JSON Java UED
uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现
以上展示了使用Java结合DCloud的uni-push进行在线消息推送的基本步骤和实现方法。实际部署时,可能需要依据实际项目的规模,业务场景及用户基数进行必要的调整和优化,确保消息推送机制在保证用户体验的同时也满足业务需求。
256 0
|
Java 设计模式
亲身实践,JAVA最优良的Adapter模式--适配器模式
网上关于JAVA的适配器模式例子有很多,但真的有少实在不怎么样,看也不懂。自己总结了一个在性能和结构上都很容易理解的Adapter模式。 Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。
907 0