zoukankan      html  css  js  c++  java
  • 设计模式之工厂方法模式

    工厂方法属创建型类模式,也称虚构造器/多态性工厂模式,工厂方法使得一个类的实例化延迟到其子类。在简单工厂模式中,产品的创建由静态工厂方法做出判断并返回相应的的对象,缺点就是当我们要添加新的类并希望创建新的对象的时候,我们需要修改静态工厂方法,有没有那种只添加新功能而不修改系统有原有功能的方案呢?当然有了,工厂方法就是一个解决方案。

    还是以生产水果为例,静态工厂方法模式中只有一个生产窗口(也就是静态工厂方法),这个生产窗口生产它所能提供的一切水果,如果客户有新需求,就要对该窗口添加新的创建方法,显然要对原系统进行修改;而工厂方法提供的管理模式更加精细化,它会创建许多窗口,每个窗口各施其职,例如生产苹果有生产品苹果的窗口,生产橘子有生产橘子的窗口,如果客户需要的水果不存在,我们只需创建这个水果类以及生产该水果的新窗口即可, 我们并未对原系统中的其他窗口做出任何修改,这对设计模式的“开-闭原则”起到了很好的支持。同样,为了方便起见,这里将所有代码均放到与测试类同一个Java文件中,代码如下:

     1 package factoryMethod;
     2 public class Test{
     3     private static Creator applecreator,grapecreator;
     4     private static Fruit apple,grape;
     5     public static void main(String[] args){
     6         applecreator=new AppleCreator();
     7         apple=applecreator.factory();
     8         grapecreator=new GrapeCreator();
     9         grape=grapecreator.factory();
    10         apple.color();
    11         grape.color();
    12     }
    13 }
    14 interface Creator{
    15     public Fruit factory();    
    16 }
    17 interface Fruit{
    18     public void taste();
    19     public void color();
    20 }
    21 class Apple implements Fruit{    
    22     public void taste(){
    23         System.out.println("I'm Sweet");
    24     }
    25     public void color(){
    26         System.out.println("I'm Red");
    27     }
    28 }
    29 class Grape implements Fruit{
    30     
    31     public void taste(){
    32         System.out.println("I'm Sour");
    33     }
    34     public void color(){
    35         System.out.println("I'm Purple");
    36     }
    37 }
    38 class AppleCreator implements Creator{
    39     public Fruit factory(){
    40         return new Apple();
    41     }    
    42 }class GrapeCreator implements Creator{
    43     public Fruit factory(){
    44         return new Grape();
    45     }    
    46 }
    View Code

    代码给出的实例中只有AppleCreator和GrapeCreator两个生产窗口,当我们需要创建新的水果比如橘子时,我们可以添加实现了Fruit接口的橘子类,同时创建一个实现了Creator的新窗口OrangeCreator类,这样生产橘子就只需创建OrangeCreator并调用factory()方法即可,我们并未对原系统代码做任何修改,我们只添加了一些新的类,但是使系统的功能更加强大。

    在Java中,实现Collection接口的集合类都包含有一个iterator()方法,该方法返回一个具体的Iterator类对象,这就是工厂方法的一个应用。工厂方法虽然已经完全支持了“开-闭原则”,但其功能还是有限,下次再总结它与抽象工厂的区别。

  • 相关阅读:
    LINQ查询表达式(1)
    JSON是什么
    .net序列化
    wampserver
    JQuery系列(1)
    c# 数据类型转换
    并不对劲的uoj311.[UNR #2]积劳成疾
    并不对劲的uoj308.[UNR #2]UOJ拯救计划
    并不对劲的CF1349B&C:Game of Median Life
    并不对劲的复健训练-CF1329B&C:Heap Sequences
  • 原文地址:https://www.cnblogs.com/codeMedita/p/6935705.html
Copyright © 2011-2022 走看看