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

抽象工厂类(二)

阅读更多
转自http://blog.csdn.net/DL88250/archive/2007/08/13/1741590.aspx
本次实例继续上次 工厂方法  中的果园农场。这次,该农场公司引进塑料大棚技术,在大棚里种植热带(Tropical)水果和蔬菜。

1. 抽象工厂实例类图




2. Java实现代码

package cn.edu.ynu.sei.abstractFactory;

/**
 * 水果接口
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 * 
@see cn.edu.ynu.sei.factoryMethod.Fruit
 
*/
public interface Fruit
{
 
}


package cn.edu.ynu.sei.abstractFactory;

/**
 * 热带水果
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public class TropicalFruit implements Fruit
{
    
/**
     * 水果名
     
*/
    
private String name;
    
    
/**
     * 构造器
     * 
@param name 果名
     
*/
    
public TropicalFruit(String name)
    {
    
this.name = name;
    }

    
/**
     * 
@return the name
     
*/
    
public String getName()
    {
        
return name;
    }

    
/**
     * 
@param name the name to set
     
*/
    
public void setName(String name)
    {
        
this.name = name;
    }
}
package cn.edu.ynu.sei.abstractFactory;

/**
 * 北方水果接口
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public class NorthernFruit implements Fruit
{
    
/**
     * 水果名
     
*/
    
private String name;
    
    
/**
     * 构造器
     * 
@param name 果名
     
*/
    
public NorthernFruit(String name)
    {
    
this.name = name;
    }

    
/**
     * 
@return the name
     
*/
    
public String getName()
    {
        
return name;
    }

    
/**
     * 
@param name the name to set
     
*/
    
public void setName(String name)
    {
        
this.name = name;
    }

    
}


package cn.edu.ynu.sei.abstractFactory;

/**
 * 蔬菜接口
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 * 
@see cn.edu.ynu.sei.factoryMethod.Fruit
 
*/
public interface Veggie
{

}


package cn.edu.ynu.sei.abstractFactory;

/**
 * 北方蔬菜
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public class NorthernVeggie implements Veggie
{
    
/**
     * 蔬菜名
     
*/
    
private String name;
    
    
/**
     * 构造器
     * 
@param name 蔬菜名
     
*/
    
public NorthernVeggie(String name)
    {
    
this.name = name;
    }

    
/**
     * 
@return the name
     
*/
    
public String getName()
    {
        
return name;
    }

    
/**
     * 
@param name the name to set
     
*/
    
public void setName(String name)
    {
        
this.name = name;
    }
}


package cn.edu.ynu.sei.abstractFactory;

/**
 * 热带蔬菜
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public class TropicalVeggie implements Veggie
{
    
/**
     * 蔬菜名
     
*/
    
private String name;
    
    
/**
     * 构造器
     * 
@param name 蔬菜名
     
*/
    
public TropicalVeggie(String name)
    {
    
this.name = name;
    }

    
/**
     * 
@return the name
     
*/
    
public String getName()
    {
        
return name;
    }

    
/**
     * 
@param name the name to set
     
*/
    
public void setName(String name)
    {
        
this.name = name;
    }
}


package cn.edu.ynu.sei.abstractFactory;

/**
 * 园丁接口
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public interface Gardener
{
    
/**
     * 水果工厂方法,产出一种水果
     * 
@param name 水果名
     * 
@return 水果
     
*/
    
public abstract Fruit createdFruit(String name);

    
/**
     * 蔬菜的工厂方法产出一种蔬菜
     * 
@param name 蔬菜名
     * 
@return 蔬菜
     
*/
    
public abstract Veggie createVeggie(String name);
}


package cn.edu.ynu.sei.abstractFactory;

/**
 * 北方园园丁
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/
public class NorthenGardener implements Gardener
{
    @Override
    
public Fruit createdFruit(String name)
    {
    
return new NorthernFruit(name);
    }

    @Override
    
public Veggie createVeggie(String name)
    {
    
return new NorthernVeggie(name);
    }
}


package cn.edu.ynu.sei.abstractFactory;

/**
 * 热带园园丁
 * 
 * 
@author 88250
 * 
@version 1.0.0, 2007-8-13
 
*/public class TropicalGardener implements Gardener
{

    @Override
    
public Fruit createdFruit(String name)
    {
    
return new TropicalFruit(name);
    }

    @Override
    
public Veggie createVeggie(String name)
    {
    
return new TropicalVeggie(name);
    }
}


3. 总结

这里我们还是讨论一下抽象工厂模式对面向对象原则中最基本的OCP原则的支持。

当增加一个新的产品族的时候我们只需要向系统中加入新的具体工厂角色和对应的具体产品角色,不需要修改原有的工厂或产品角色的代码,所以此时抽象模式是完全支持OCP的。

当增加新的产品等级结构时就需要修改相关的具体工厂代码。例如在农场公司系统中有一种热带水果类别继承于现用热带水果类别,这时我们不得不修改热带水果具体工厂的代码,新增加一个工厂方法给它。这样是不符合OCP的。

所以抽象工厂只是在一定程度上支持OCP的,在设计的时候这点很值得我们注意。
分享到:
评论

相关推荐

    抽象工厂模式简单小例子

    #### 二、抽象工厂模式应用场景 在软件开发过程中,当需要创建一系列相关联的对象,并且希望这些对象之间保持一致性时,抽象工厂模式就能发挥其作用。例如,在构建大型系统时,可能会遇到需要根据不同环境(如操作...

    .net抽象工厂+存储过程添加数据

    - **抽象工厂类定义**:接下来定义一个抽象工厂类 `DALFactory`,该类包含静态方法 `factoryDB()` 和抽象方法 `createUserinfo()`。 - **示例代码**: ```csharp public abstract class DALFactory { public ...

    c#工厂模式——简单工厂_抽象工厂实例

    - **缺点**:系统中产品族较多时,抽象工厂类会非常庞大。 **示例**: 代码中展示了如何使用抽象工厂模式创建不同类型的计算机部件。`ComputerFactory` 类实现了 `ComputerInterface` 接口,该接口定义了创建不同...

    抽象工厂访问不同的数据库(反射+缓存)

    抽象工厂定义了一个用于创建对象的接口,而具体的工厂类则负责实现这个接口,为特定的数据库(如MySQL、Oracle、SQL Server等)生成相应的数据库操作对象。 接下来,反射是Java等语言中的一种高级特性,它允许程序...

    java之 抽象工厂模式(abstract factory)

    2. **具体工厂类(Concrete Factory)**:实现了抽象工厂接口,提供了具体的对象创建逻辑。对应于“北方市场”和“南方市场”,我们可以有`NorthMarketFactory`和`SouthMarketFactory`,它们分别实现`MarketFactory`...

    JAVA设计模式研究之抽象工厂模式

    在JAVA中实现抽象工厂模式,首先需要定义一个抽象工厂类,该类包含多个抽象方法,每个方法返回不同类型的产品。然后,为每种产品族定义具体的工厂类,这些工厂类实现抽象工厂接口,创建相应的产品族。接下来,定义...

    C++ 工厂模式 (简单工厂、工厂和抽象工厂)

    ### C++工厂模式详解:简单工厂、工厂方法与抽象工厂 #### 一、引言 在软件工程领域,设计模式是一种被广泛接受的解决常见问题的解决方案。其中,工厂模式是一种常用的创建型模式,用于封装对象的创建过程,提供一...

    AbstractFactory.rar抽象工厂

    在实际应用中,我们会有不同的具体工厂类(ConcreteFactory)实现抽象工厂接口,每个具体工厂负责创建特定的产品族。例如,假设有一个“家具工厂”抽象工厂,可能有“欧式家具工厂”和“中式家具工厂”两个具体工厂...

    简单工厂模式、工厂模式、抽象工厂模式

    ### 简单工厂模式、工厂模式、抽象工厂模式 #### 一、引子 假设有一位暴发户,家里有两辆豪车——Benz和BMW,并雇用了司机为他服务。按照原始的设计思路,每当暴发户需要用车时,都需要明确告诉司机要开哪辆车。...

    二十三种设计模式Java版之抽象工厂模式

    抽象工厂模式是设计模式中的创建型模式之一,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在Java中,抽象工厂模式通常用于在不同平台或环境中创建一组相关对象,这些对象可能具有不同...

    设计模式--抽象工厂之小解

    **二、抽象工厂模式的组成角色** 1. **抽象工厂(Abstract Factory)**: 定义一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 2. **具体工厂(Concrete Factory)**: 实现抽象工厂接口,提供...

    抽象工厂方法习题4.zip

    抽象工厂方法模式是一种重要的设计模式,它属于创建型模式,主要解决的是当系统需要创建一系列相关或相互依赖的对象时,而这些对象的类在运行时可能未知的问题。在这个"抽象工厂方法习题4.zip"中,我们可以深入学习...

    Java设计模式之抽象工厂模式

    #### 二、抽象工厂模式的创建过程及优点 在抽象工厂模式中,存在一个抽象工厂接口,以及多个具体实现该接口的工厂类。每个具体工厂负责创建一个特定的产品族,即一系列紧密相关的对象。这样做的好处在于: - **...

    抽象工厂使用简便

    1. **抽象工厂模式**:可以定义多个工厂类,每个工厂类负责创建一组相关的产品对象。这样,当需要增加新产品时,只需要新增一个具体的工厂类即可,无需修改已有的工厂类。 2. **使用反射**:可以通过反射动态加载...

    C#三层和抽象工厂酒店管理系统

    2. **具体工厂类**:实现了抽象工厂接口,为每一种房间类型提供具体的对象实例。 3. **产品接口**:表示各种房间类型,例如`IRoom`接口可以包含`Book()`、`CheckIn()`和`CheckOut()`方法。 4. **产品实现类**:...

    C#三层和抽象工厂示例代码及一个小例题

    **二、抽象工厂模式** 抽象工厂模式提供一个接口,用于创建一组相关或相互依赖的对象,而不必指定它们的具体类。在C#中,我们可以通过定义一个接口(例如`IProductFactory`),然后创建多个实现了该接口的工厂类...

    设计模式 抽象工厂模式实现

    #### 二、抽象工厂模式定义 抽象工厂模式(Abstract Factory Pattern)提供了一个创建一系列相关或相互依赖对象的接口,且无须指定这些对象所属的具体类。这种模式特别适用于当系统需要创建一组相关的对象时,而这些...

Global site tag (gtag.js) - Google Analytics