`
zzg
  • 浏览: 123946 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

工厂方法(一)

阅读更多
这次的实例讲的是在一个果园中种有3种水果,勤劳的园丁负责照看它们,当有客户需要水果的时候就给他们。

1. 工厂方法实例类图




2. Java实现代码


package cn.edu.ynu.sei.factoryMethod;

/**
 * 果园园丁接口
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-12
 * @uml.dependency supplier="cn.edu.ynu.sei.factoryMethod.Fruit"
 
*/
public interface FruitGardener
{
    
/**
     * 工厂方法
     * 
     * 
@return 水果作物
     
*/
    
public abstract Fruit factory();

    
/**
     * @uml.property name="client"
     * @uml.associationEnd inverse="fruitGardener:cn.edu.ynu.sei.factoryMethod.Client"
     
*/
    
public Client client = null;
}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 苹果园园丁
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-12
 
*/
public class AppleGardener implements FruitGardener
{

    
/**
     * 工厂方法,返回苹果作物的实例
     
*/
    @Override
    
public Fruit factory()
    {
    
return new Apple();
    }

}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 草莓园园丁
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-12
 
*/
public class StrawberryGardener implements FruitGardener
{

    
/**
     * 工厂方法,返回草莓作物实例
     
*/
    @Override
    
public Fruit factory()
    {
    
return new Strawberry();
    }

}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 葡萄园园丁
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-12
 
*/
public class GrapeGardener implements FruitGardener
{
    
/**
     * 工厂方法,返回葡萄作物对象
     
*/
    @Override
    
public Fruit factory()
    {
    
return new Grape();
    }

}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 水果作物接口
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-12
 
*/
public interface Fruit
{

    
/**
     * 作物生长
     
*/
    
public abstract void grow();

    
/**
     * 收获作物
     
*/
    
public abstract void harvest();

    
/**
     * 种植作物
     
*/
    
public abstract void plant();

}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 苹果作物
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-12
 
*/
public class Apple implements Fruit
{
    
/**
     * 树龄
     
*/
    
private int treeAge;

    
/*
     * (non-Javadoc)
     * 
     * @see cn.edu.ynu.sei.factoryMethod.Fruit#grow()
     
*/
    @Override
    
public void grow()
    {
    System.out.println(
"Apple is growing....");
    }

    
/*
     * (non-Javadoc)
     * 
     * @see cn.edu.ynu.sei.factoryMethod.Fruit#harvest()
     
*/
    @Override
    
public void harvest()
    {
    System.out.println(
"Apple has been harvested.");
    }

    
/*
     * (non-Javadoc)
     * 
     * @see cn.edu.ynu.sei.factoryMethod.Fruit#plant()
     
*/
    @Override
    
public void plant()
    {
    System.out.println(
"Apple has been planted.");
    }

    
/**
     * 返回树龄
     * 
     * 
@return 树龄
     
*/
    
public int getTreeAge()
    {
    
return treeAge;
    }

    
/**
     * 设置树龄
     * 
     * 
@param treeAge
     *                树龄
     
*/
    
public void setTreeAge(int treeAge)
    {
    
this.treeAge = treeAge;
    }
}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 草莓作物
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public class Strawberry implements Fruit
{

    @Override
    
public void grow()
    {
    System.out.println(
"Strawberry is growing....");
    }

    @Override
    
public void harvest()
    {
    System.out.println(
"Strawberry has been harvested.");
    }

    @Override
    
public void plant()
    {
    System.out.println(
"Strawberry has been planted.");
    }

}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 葡萄作物
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-12
 
*/
public class Grape implements Fruit
{
    
/**
     * 无籽葡萄?
     
*/
    
private boolean seedless;
    
    
/*
     * (non-Javadoc)
     * 
     * @see cn.edu.ynu.sei.factoryMethod.Fruit#grow()
     
*/
    @Override
    
public void grow()
    {
    System.out.println(
"Grape is growing....");
    }

    
/*
     * (non-Javadoc)
     * 
     * @see cn.edu.ynu.sei.factoryMethod.Fruit#harvest()
     
*/
    @Override
    
public void harvest()
    {
    System.out.println(
"Grape has been harvested.");
    }

    
/*
     * (non-Javadoc)
     * 
     * @see cn.edu.ynu.sei.factoryMethod.Fruit#plant()
     
*/
    @Override
    
public void plant()
    {
    System.out.println(
"Grape has been planted.");
    }
    
    
/**
     * 是否无籽?
     * 
@return 
     
*/
    
public boolean getSeedless()
    {
    
return seedless;
    }
    
    
/**
     * 设置是否无籽
     * 
@param seedless
     
*/
    
public void setSeedless(boolean seedless)
    {
    
this.seedless = seedless;
    }
}


package cn.edu.ynu.sei.factoryMethod;

/**
 * 果园的客户
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public class Client
{
    
/**
     * 主程序入口点
     * 
     * 
@param args
     *                <code>null</code>
     
*/
    
public static void main(String[] args)
    {
    Fruit apple, strawberry, grape;

    fruitGardener 
= new AppleGardener();

    apple 
= fruitGardener.factory();
    apple.plant();
    
    fruitGardener 
= new StrawberryGardener();
    strawberry 
= fruitGardener.factory();
    strawberry.plant();
    strawberry.grow();
    
    fruitGardener 
= new GrapeGardener();
    grape 
= fruitGardener.factory();
    grape.harvest();
    
    apple.harvest();
    }

    
/**
     * @uml.property name="fruitGardener"
     * @uml.associationEnd inverse="client1:cn.edu.ynu.sei.factoryMethod.FruitGardener"
     
*/
    
private static FruitGardener fruitGardener;

    
/**
     * Getter of the property <tt>fruitGardener</tt>
     * 
     * 
@return Returns the fruitGardener.
     * @uml.property name="fruitGardener"
     * @uml.associationEnd inverse="client1:cn.edu.ynu.sei.factoryMethod.FruitGardener"
     
*/
    
public FruitGardener getFruitGardener()
    {
    
return fruitGardener;
    }

    
/**
     * Setter of the property <tt>fruitGardener</tt>
     * 
     * 
@param fruitGardener
     *                The fruitGardener to set.
     * @uml.property name="fruitGardener"
     * @uml.associationEnd inverse="client1:cn.edu.ynu.sei.factoryMethod.FruitGardener"
     
*/
    
public void setFruitGardener(FruitGardener fruitGardener)
    {
    Client.fruitGardener 
= fruitGardener;
    }

}
 

3. 总结

工 厂方法模式是简单工厂模式的一个“升级”,其核心由简单工厂中的具体类变成了现在的抽象接口。这样做的好处是可以完全支持OCP,既“开-闭”原则。当系 统需要加入一个新的产品时,那么所要做的就是加入这个新产品的类以及对应的工厂类。客户端完全不用修改,也没有必要修改抽象工厂角色或者其他已有的具体工 厂角色,所以说这个模式是完全支持OCP的。

抽象工厂角色和抽象产品角色都可以选择由Java接口或者是Java抽象类来实现。如 果具体工厂角色具有共同逻辑的话,那么这些共同逻辑就可以向上移动到抽象工厂角色中,这也就意味着抽象工厂角色应该使用Java抽象类来实现,在抽象角色 里提供默认的工厂方法,相反的华就应该用Java接口实现,对抽象产品也是一样的。

这里需要注意的是任何方法都不应该复写它的基类中的已经实现的方法,否则将违反DIP
(Dependency-Inversion Principles) 依赖倒置原则,细节请参考 面向对象的设计原则摘要
分享到:
评论

相关推荐

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂方法模式将具体的对象创建过程延迟到子类中,通过接口或抽象类定义创建对象的方法,每个子类对应一个具体的产品。这种方式使得系统更具有扩展性,增加了新的产品只需添加新的子类即可,无需修改原有代码。工厂...

    工厂方法模式工厂方法模式

    工厂方法模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂类负责创建对象,但允许子类决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行,使得代码更加灵活且易于扩展...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    工厂方法模式和抽象工厂模式的区别

    首先,工厂方法模式的核心是定义一个创建对象的接口,但由子类决定实例化哪一个类。它将对象的创建延迟到子类中进行,使得代码更加模块化,易于维护和扩展。工厂方法模式通常只有一个方法,这个方法负责创建一个特定...

    简单工厂-工厂方法-抽象工厂 对比总结

    工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂角色不再负责所有的产品创建,而是将这个责任"下放"给各个子类去完成。这样做的好处是增加了系统的灵活性,当需要添加新产品时,只...

    用工厂方法模式做的一个简易计算器

    在这个例子中,我们讨论的是如何使用工厂方法模式(Factory Method Pattern)实现一个简易计算器。工厂方法模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂接口或者抽象类...

    工厂方法和抽象工厂——Factory Method & Abstract Factory

    - 在实际应用中,工厂方法模式常常作为抽象工厂模式的一个子集出现,即抽象工厂模式可以包含多个工厂方法,分别对应工厂方法模式。 通过了解这两种模式,开发者可以在设计系统时根据需求选择合适的模式,提高代码的...

    工厂方法模式代码示例

    工厂方法模式是一种面向对象的设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 工厂方法模式的核心思想是...

    java工厂方法模式

    Java工厂方法模式是一种创建型模式,它属于类的创建型模式。该模式的主要思想是,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定...

    工厂方法模式Demo

    工厂方法模式是一种面向对象的设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂类负责创建所关心的对象,而客户端代码则使用这些对象,而不必知道对象是如何被创建的。这种...

    工厂方法模式的C语言实现

    工厂方法模式是一种设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,当我们创建对象时,不会直接实例化具体的产品类,而是通过一个工厂类来创建。这样做的好处是,当需要添加新的产品...

    工厂方法模式源代码

    工厂方法模式(Factory Method Pattern)是设计模式中的创建型模式之一,它定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这个模式使类的实例化延迟到了子类,也就是所谓的“多态性工厂”。在Java中,...

    抽象工厂,工厂方法,简单工厂

    在软件设计模式中,"抽象工厂"、"工厂方法"和"简单工厂"都是创建型设计模式,它们都用于封装对象的创建过程,提供了一种间接的途径来创建对象,从而使得代码更加灵活,易于扩展。下面将详细介绍这三个工厂模式。 ##...

    设计模式之工厂方法、简单工厂、抽象工厂

    工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。这个接口叫做工厂方法,让子类决定实例化哪一个对象。工厂方法将一个类的实例化延迟到其子类。这种方式提供了一种封装对象创建的方式,使得...

    Java 工厂模式 抽象工厂 工厂方法模式

    **工厂方法模式**:这是一种更为灵活的工厂模式变体,它将对象的创建延迟到子类中进行。在工厂方法模式中,父类定义了一个创建对象的接口,但由子类来决定要实例化的具体类。这种方式使得系统更具可扩展性,当需要...

    工厂方法模式源文件

    工厂方法模式是面向对象设计模式中的行为模式,它属于创建型模式的一种,主要解决的是当一个类不知道它所必须创建的对象的类的时候,或者当一个类希望由它的子类来决定实例化哪个类的时候,如何封装这个实例化过程的...

    工厂方法应用实例源码

    首先,工厂方法是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以把实例化推迟到子类中进行。在这个例子中,我们可能有一个`PieFactory`接口或抽象类,它定义...

    用工厂方法模式重构简易计算器 源代码+实验报告

    工厂方法模式(Factory Method Pattern)是面向对象设计模式的一种,它在实际开发中有着广泛的应用。本项目通过工厂方法模式重构简易计算器,旨在展示这种模式在实现基本计算功能时的优势。 首先,我们要理解工厂...

    设计模式-工厂方法模式

    工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个类(称为工厂类)不再直接实例化具体的产品,而是定义一个接口或抽象类,由子类来决定实例化哪一个类。这样做的好处在于...

    工厂方法模式应用案例

    工厂方法模式是面向对象设计模式中的行为模式之一,它提供了一种创建对象的最佳方式。在工厂方法模式中,我们创建对象时不直接实例化具体的产品,而是通过一个抽象工厂类来调用具体工厂子类的方法来生成对应的具体...

Global site tag (gtag.js) - Google Analytics