工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
类图结构:
下面我们通过代码实现上面的类图:
1,首先我们定义产品接口,我们定义一个手机这个接口,基本的手机都用打电话发短信的功能
/*
* @(#)Mobile.java 2014-3-17
*/
package com.lotus.test.factory;
/**
* 手机抽象接口
* @author tsface
* @version 2014-3-17
* @since 1.0
*/
public interface Mobile
{
//发送消息
public void sendMessage();
//打电话
public void call();
}
2,有了手机接口,我们就有具体的产品,我们假设Iphone手机和Moto手机都遵循标准接口
/*
* @(#)IphoneMobile.java 2014-3-17
*/
package com.lotus.test.factory.product;
import com.lotus.test.factory.Mobile;
/**
* Iphone手机实现类
* @author Administrator
* @version 2014-3-17
* @since 1.0
* @see
*/
public class IphoneMobile implements Mobile
{
private String _mobile = "Iphone";
@Override
public void sendMessage()
{
System.out.println(_mobile + "发送消息成功");
}
@Override
public void call()
{
System.out.println(_mobile + "拨打电话成功");
}
}
/*
* @(#)MotoMobile.java 2014-3-17
*/
package com.lotus.test.factory.product;
import com.lotus.test.factory.Mobile;
/**
* Moto手机
* @author Administrator
* @version 2014-3-17
* @since 1.0
* @see
*/
public class MotoMobile implements Mobile
{
private String _mobile = "Moto";
@Override
public void sendMessage()
{
System.out.println(_mobile + "发送消息成功");
}
@Override
public void call()
{
System.out.println(_mobile + "拨打电话成功");
}
}
3,产品的设计基本上已经完成,那么产品总要有工厂去设计,在这里我们假设所有的工厂都会遵守一个符合某一标准的基本规范,或者说至少一个工厂都应该能生产初手机,那么我们不妨设计一个高度抽象的工厂接口。
/*
* @(#)IMobileFactory.java 2014-3-17
*/
package com.lotus.test.factory;
/**
* 描述当前类的作用
* @author Administrator
* @version 2014-3-17
* @since 1.0
* @see
*/
public interface IMobileFactory
{
//创建手机
public Mobile createMobile();
}
4,不同的手机生产的工厂不一样,比如Iphone的手机生产可能是A工厂,Moto的生产上是B工厂
/*
* @(#)IphoneMobileFactory.java 2014-3-17
*/
package com.lotus.test.factory.createor;
import com.lotus.test.factory.IMobileFactory;
import com.lotus.test.factory.Mobile;
import com.lotus.test.factory.product.IphoneMobile;
/**
* 创建Iphone手机的工厂类
* @author Administrator
* @version 2014-3-17
* @since 1.0
*/
public class IphoneMobileFactory implements IMobileFactory
{
/* (non-Javadoc)
* @see com.lotus.test.factory.IMobileFactory#createMobile()
*/
@Override
public Mobile createMobile()
{
return new IphoneMobile();
}
}
/*
* @(#)MotoMobileFactory.java 2014-3-17
*/
package com.lotus.test.factory.createor;
import com.lotus.test.factory.IMobileFactory;
import com.lotus.test.factory.Mobile;
import com.lotus.test.factory.product.MotoMobile;
/**
* Moto手机工厂类
* @author Administrator
* @version 2014-3-17
* @since 1.0
*/
public class MotoMobileFactory implements IMobileFactory
{
/* (non-Javadoc)
* @see com.lotus.test.factory.IMobileFactory#createMobile()
*/
@Override
public Mobile createMobile()
{
return new MotoMobile();
}
}
上面代码完成了,以上代码就是对类图的描述。那么我们看看客户端是怎么利用工厂生产出手机,怎么使用手机的
/*
* @(#)Client.java 2014-3-17
*/
package com.lotus.test.factory;
import com.lotus.test.factory.createor.IphoneMobileFactory;
import com.lotus.test.factory.createor.MotoMobileFactory;
/**
* 描述当前类的作用
* @author Administrator
* @version 2014-3-17
* @since 1.0
*/
public class Client
{
/**
* @param args
*/
public static void main(String[] args)
{
//创建Iphone手机工厂
IMobileFactory iphoneFactory = new IphoneMobileFactory();
//创建Moto手机工厂
IMobileFactory motoFactory = new MotoMobileFactory();
//生产一部Iphone手机
Mobile iphone = iphoneFactory.createMobile();
//生产一部Moto手机
Mobile moto = motoFactory.createMobile();
//测试用IPhone手机打电话发短信
iphone.call();
iphone.sendMessage();
//测试用Moto手机打电话发短信
moto.call();
moto.sendMessage();
}
}
通过上面的代码我们得出以下:
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法吧简单工厂的内部逻辑判断移动到了客户端代码中进行。如果想加功能,本来是改工厂类,而现在只是修改客户端。
2014/03/17 tsface 南京
hanily@msn.com