Java使用设计模式中的工厂方法模式实例解析

 更新时间:2016年05月13日 09:44:05   作者:pastqing  
当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统.工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,下面我们会具体介绍Java使用设计模式中的工厂方法模式实例解析.

工厂方法模式的定义
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
它包含了如下角色:

  • 抽象产品(Product)
  • 具体产品(ConcreteProduct)
  • 抽象工厂(Factory)
  • 具体工厂(ConcreteFactory)

模式的UML类图

201651393550989.jpg (512×303)

实例
假设有三个笔芯,分别是红笔芯、蓝笔芯和黑笔芯。用户希望通过圆珠笔来明确笔芯的颜色。
模式的结构的描述与使用
1.抽象产品(Product): PenCore.java

public abstract class PenCore{
  String color;
  public abstract void writeWord(String s);
}

2.具体产品(ConcreteProduct)_1 : RedPenCore.java

public class RedPenCore extends PenCore{
  RedPenCore(){
   color="红色";
  }
  public void writeWord(String s){
    System.out.println("写出"+color+"的字:"+s);
  }
}

具体产品(ConcreteProduct)_2 : BluePenCore.java

public class BluePenCore extends PenCore{
  BluePenCore(){
   color="蓝色";
  }
  public void writeWord(String s){
    System.out.println("写出"+color+"的字:"+s);
  }
}

具体产品(ConcreteProduct)_3: BlackPenCore.java

public class BlackPenCore extends PenCore{
  BlackPenCore(){
   color="黑色";
  }
  public void writeWord(String s){
    System.out.println("写出"+color+"的字:"+s);
  }
}

3.构造者(Creator): BallPen.java

public abstract class BallPen{
  BallPen(){
    System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");
  }
  public abstract PenCore getPenCore(); //工厂方法
}

4.具体构造者(ConcreteCreator):

RedBallPen.java
public class RedBallPen extends BallPen{
  public PenCore getPenCore(){
    return new RedPenCore();
  }
}
BlueBallPen.java
public class BlueBallPen extends BallPen{
  public PenCore getPenCore(){
    return new BluePenCore();
  }
}
BlackBallPen.java
public class BlackBallPen extends BallPen{
  public PenCore getPenCore(){
    return new BlackPenCore();
  }
}

5.应用 Application.java

public class Application{
  public static void main(String args[]){
    PenCore penCore;
    BallPen ballPen=new BlueBallPen();
    penCore=ballPen.getPenCore();
    penCore.writeWord("你好,很高兴认识你");
    ballPen=new RedBallPen();
    penCore=ballPen.getPenCore();
    penCore.writeWord("How are you");
    ballPen=new BlackBallPen();
    penCore=ballPen.getPenCore();
    penCore.writeWord("nice to meet you");
  }
} 

总结
工厂方法模式属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品
工厂方法模式的主要优点是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;其缺点在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性

相关文章

  • Java并发编程示例(九):本地线程变量的使用

    Java并发编程示例(九):本地线程变量的使用

    这篇文章主要介绍了Java并发编程示例(九):本地线程变量的使用,有时,我们更希望能在线程内单独使用,而不和其他使用同一对象启动的线程共享,Java并发接口提供了一种很清晰的机制来满足此需求,该机制称为本地线程变量,需要的朋友可以参考下
    2014-12-12
  • Java设计模式之解释器模式

    Java设计模式之解释器模式

    这篇文章介绍了Java设计模式之解释器模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • java 线程池keepAliveTime的含义说明

    java 线程池keepAliveTime的含义说明

    这篇文章主要介绍了java 线程池keepAliveTime的含义说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java有趣好玩的图形界面开发八个案例实现

    Java有趣好玩的图形界面开发八个案例实现

    今天使用GUI技术写了几个练习的Demo,希望对大家学习图形用户界面有所帮助,感兴趣的同学来看看吧,动手敲一遍理解更通透
    2022-05-05
  • Javassist用法详解

    Javassist用法详解

    这篇文章主要介绍了Javassist用法的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • Springmvc中的转发重定向和拦截器的示例

    Springmvc中的转发重定向和拦截器的示例

    本篇文章主要介绍了Springmvc中的转发重定向和拦截器的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 入门JDK集合之HashMap解析

    入门JDK集合之HashMap解析

    HashMap---基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同
    2021-06-06
  • Java中关于OAuth2.0的原理分析

    Java中关于OAuth2.0的原理分析

    这篇文章主要介绍了Java中关于OAuth2.0的原理分析,OAuth是一个关于授权的开放网络标准,允许用户授权第三 方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,需要的朋友可以参考下
    2023-09-09
  • Java设计模式之原型模式详细解析

    Java设计模式之原型模式详细解析

    这篇文章主要介绍了Java设计模式之原型模式详细解析,原型模式就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象,需要的朋友可以参考下
    2023-11-11
  • application.yml和bootstrap.yml不生效的3种解决方案

    application.yml和bootstrap.yml不生效的3种解决方案

    SpringBoot默认支持 properties(.properties) 和 YAML(.yml .yaml ) 配置文件,本文主要介绍了application.yml和bootstrap.yml不生效的3种解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论