《java与模式》笔记(八) 简单工厂模式

本文介绍简单工厂模式的概念、结构及其实现方式,并通过一个农场水果生产的例子详细解释了工厂类、抽象产品角色和具体产品角色等核心概念。

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。

ξ 12.1 工厂模式的几种形态:

① 简单工厂(Simple Factory),又称静态工厂方法模式;
② 工厂方法(Factory Method),又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virual Constructor)模式;
③ 抽象工厂(Abstract Factory),又称工具箱(Kit或Toolkit)模式。

☆ 简单工厂模式,是不同的工厂方法模式的一个特殊实现。在java语言中,通常的工厂方法模式不能通过设计功能的退化给出静态工厂模式。

ξ 12.2 简单工厂模式的引进
本节通过一个农场的实例来引入简单工厂模式,农场供应三种水果,他们是Grape、Strawberry和Apple。还有一位园丁FruitGardener,他负责提供客户需要的水果。他们的UML图如下:

水果接口定义出所有水果的抽象,具体行为包括种植、生长和收获,代码如下:

public interface Fruit
{
    
public void grow();
    
public void harvest();
    
public void plant();
}

Apple是一种水果,同时由于是多年生植物,多出一个treeAge属性,代码如下:

public class Apple implements Fruit
{
    
public void grow()
    
{
        System.out.println( 
"Apple:grow" ) ;
    }

    
    
public void harvest()
    
{
        System.out.println( 
"Apple:havest" ) ;
    }

    
    
public void plant()
    
{
        System.out.println( 
"Apple:plant" ) ;
    }

    
    
private int treeAge ;
    
    
public int getTreeAge()
    
{
        
return this.treeAge ;
    }

    
    
public void setTreeAge( int treeAge )
    
{
        
this.treeAge = treeAge ;
    }

}

Grape也是一种水果,同时具有seedles属性区分是否有籽,代码如下:

public class Grape implements Fruit
{
    
private boolean seedless;

    
public void grow()
    
{
        System.out.println( 
"Grape:grow" ) ;
    }

    
    
public void harvest()
    
{
        System.out.println( 
"Grape:havest" ) ;
    }

    
    
public void plant()
    
{
        System.out.println( 
"Grape:plant" ) ;
    }


    
public boolean getSeedless()
    
{
        
return seedless ;
    }


    
public void setSeedless(boolean seedless)
    
{
        
this.seedless = seedless ;
    }

}

Strawberry的代码如下:

public class Strawberry implements Fruit
{
    
public void grow()
    
{
        System.out.println( 
"Strawberry:grow" ) ;
    }

    
    
public void harvest()
    
{
        System.out.println( 
"Strawberry:havest" ) ;
    }

    
    
public void plant()
    
{
        System.out.println( 
"Strawberry:plant" ) ;
    }

}

园丁FruitGardener是农场中的工厂类角色,它负责根据客户的不同需求(传入的参数不同)来产生不同的水果。它的代码如下:

public class FruitGardener
{
    
public static Fruit getFruit( String name )
    
{
        Fruit result 
= null ;
        
        
if ( name.equalsIgnoreCase( "apple" ) )
            result 
= new Apple() ;
        
else if ( name.equalsIgnoreCase( "grape" ) )
            result 
= new Grape() ;
        
else if ( name.equalsIgnoreCase( "strawberry" ) )
            result 
= new Strawberry() ;
        
        
return result ;
    }

}

ξ 12.3 简单工厂模式的结构

☆ 简单工厂模式涉及到三个角色:
① 工厂类角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体java类实现。
② 抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个java接口或者java抽象类实现。
③ 具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体java类实现。

ξ 12.4 简单工厂模式的实现

☆ 对多层次的产品结构,简单工厂模式统一使用一个工厂类。好处是设计简单,缺点是新增的产品必将导致工厂类的修改。

☆ 一个工厂类中可以有多个工厂方法用来返回不同的产品角色

☆ 简单工厂方法中角色的省略
① 抽象产品角色的省略,如果系统中只有一个具体产品,可以省略掉抽象产品角色;
② 工厂角色与抽象产品角色合并,典型如java.text.DateFormat;
③ 三个角色全部合并。

ξ 12.5 简单工厂模式与其他模式的关系
单例、多例模式都是简单工厂方法的特殊应用,其他还有备忘录模式和更高级的MVC模式。

ξ 12.6 简单工厂模式的优点和缺点
☆ 优点:该模式的核心是工厂类,这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责消费产品,简单工厂模式通过这种做法实现了对责任的分割。

☆ 缺点:工厂类担负太多的逻辑,形成了全能的上帝类;简单工厂模式的工厂是静态实现,无法继承;工厂类通常只能部分满足开闭原则。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值