java中23种设计模式之3-抽象工厂模式(abstract factory pattern)
抽象工厂模式的定义:
Provide an interface for creating families of related or dependent objects without specifying their concrete classes。 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
不同于工厂模式关于于产品等级,抽象工厂模式关注于产品族。
以生产球类体育用品为例: 产品为球,产品等级也就是产品种类分为足球和篮球,产品族分为NIKE牌球和ADIDAS牌球.
/*****************product****************************/
interface IBall
{
void Ball();
}
abstract class FootBall implements IBall
{
public void Ball()
{
System.out.println("this is a FootBall");
}
}
abstract class BasketBall implements IBall
{
public void Ball()
{
System.out.println("this is a BasketBall");
}
}
class NikeFootBall extends FootBall
{
public void Ball()
{
System.out.println("this is a NikeFootBall");
}
}
class NikeBasketBall extends BasketBall
{
public void Ball()
{
System.out.println("this is a NikeBasketBall");
}
}
class AdidasFootBall extends FootBall
{
public void Ball()
{
System.out.println("this is a AdidasFootBall");
}
}
class AdidasBasketBall extends FootBall
{
public void Ball()
{
System.out.println("this is a AdidasBasketBall");
}
}
enum BallEnum
{
NIKE_FOOTBALL("NikeFootBall"),
NIKE_BASKETBALL("NikeBasketBall"),
ADIDAS_FOOTBALL("AdidasFootBall"),
ADIDAS_BASKETBALL("AdidasBasketBall");
private String value="";
private BallEnum(String value)
{
this.value=value;
}
public String getValue()
{
return this.value;
}
}
/***********************factory************************************/
interface IFactory
{
IBall makeFootBall();
IBall makeBasketBall();
}
abstract class BallFactory implements IFactory
{
public IBall makeBall(BallEnum aBallEnum)
{
IBall aIBall=null;
if(!aBallEnum.getValue().equals(""))
{
try
{
aIBall=(IBall)Class.forName(aBallEnum.getValue()).newInstance();
}
catch(Exception e)
{
e.printStackTrace();
}
}
return aIBall;
}
}
class NikeBallFactory extends BallFactory
{
public IBall makeFootBall()
{
return super.makeBall(BallEnum.NIKE_FOOTBALL);
}
public IBall makeBasketBall()
{
return super.makeBall(BallEnum.NIKE_BASKETBALL);
}
}
class AdidasBallFactory extends BallFactory
{
public IBall makeFootBall()
{
return super.makeBall(BallEnum.ADIDAS_FOOTBALL);
}
public IBall makeBasketBall()
{
return super.makeBall(BallEnum.ADIDAS_BASKETBALL);
}
}
public class AbstractFactoryPatternTest{
public static void main(String[] args)
{
IFactory aIFactory = new NikeBallFactory();
IBall aNikeFootBall=aIFactory.makeFootBall();
aNikeFootBall.Ball();
IBall aNikeBasketBall=aIFactory.makeBasketBall();
aNikeBasketBall.Ball();
aIFactory = new AdidasBallFactory();
IBall aAdidasFootBall=aIFactory.makeFootBall();
aAdidasFootBall.Ball();
IBall aAdidasBasketBall=aIFactory.makeBasketBall();
aAdidasBasketBall.Ball();
}
}
/////////////////////////
输出结果:
this is a NikeFootBall
this is a NikeBasketBall
this is a AdidasFootBall
this is a AdidasBasketBall