定义
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类。
优点
- 封装性好,高层不必关心实现类。
缺点
- 产品族扩展非常困难,增加一个产品,则对应的抽象工厂要增加方法,工厂的实现类也要增加方法,违反开闭原则。
示例代码
/*
* 产品键盘类
* **/
public interface Keybo
{
void sayHi();
}
/*
* 惠普键盘
* **/
public class HpKeybo implements Keybo
{
@Override
public void sayHi()
{
System.out.println("HpKeybo created");
}
}
/*
* 戴尔键盘
* **/
public class DaliKeybo implements Keybo
{
@Override
public void sayHi()
{
System.out.println("DaliKeybo crated");
}
}
/*
* 产品鼠标类
* **/
public interface Mouse
{
void sayHi();
}
//省略两个鼠标的实现类
/*
* 抽象工厂模式
* 一个产品 多个公司生产
* 一个公司 生产不同产品 eg 键盘 鼠标
* 这样得到一个公司的工厂就能实现同一公司的产品
* */
public interface PcFactory
{
Mouse createMouse();
Keybo createKeybo();
public static void main(String[] args)
{
PcFactory pcFactory = new HpFactory();
Keybo keybo = pcFactory.createKeybo();//惠普工厂生产的键盘,只能是惠普键盘
keybo.sayHi();
}
}
/**
*戴尔工厂
*/
public class DaliFactory implements PcFactory
{
@Override
public Mouse createMouse()
{
return new DaliMouse();
}
@Override
public Keybo createKeybo()
{
// TODO Auto-generated method stub
return new DaliKeybo();
}
}
/**
* 惠普工厂
* @author Administrator
*
*/
public class HpFactory implements PcFactory
{
@Override
public Mouse createMouse()
{
return new HpMouse();
}
@Override
public Keybo createKeybo()
{
return new HpKeybo();
}
}
上图A,B就类似鼠标键盘,1和2就是两个公司的工厂,A1A2有共同的属性,而A1B1又存在着某种关系。
上面所说的扩展困难指的是产品族扩展困难,即要增加新的产品C困难,抽象工厂和具体工厂都要增加产生C的方法。
如果是扩展产品等级则是极其容易的,假设华硕工厂要生产鼠标键盘,则只需多添加华硕鼠标实现类,华硕键盘实现类,再增加一个华硕工厂,原来的代码一字不动。