抽象工厂模式是以产品族为基准的,何为产品族呢,就是多个产品合成一个产品,如键鼠套装(键盘加鼠标),这就是一个简单的产品族.而抽象工厂模式就是用来生产这些相似的产品族的.
Talk is cheap ,show u the code
需求1:甲方需要生产一套键鼠套装,做好了就行;
ok,很简单的需求,先简单画下图:
简单的工厂模式即可:
具体的就不实现了,相信都会
interface IProduct1
{
}
interface IMouse extends IProduct1
{
}
interface IKeyboard extends IProduct1
{
}
class Mouse implements IMouse
{
}
class KeyBoard implements IKeyboard
{
}
abstract class ProductFactory1
{
public abstract <T extends IProduct1> T create();
}
class MouseFactory extends ProductFactory1
{
@Override
public <T extends IProduct1> T create()
{
return (T) new Mouse();
}
}
class KeyBoardFactory extends ProductFactory1
{
@Override
public <T extends IProduct1> T create()
{
return (T) new KeyBoard();
}
}
在这里也可以采用单个工厂的方式:
abstract class ProductFactory2
{
public abstract <T extends IProduct1>T create(Class<T>c);
}
class ProductFacory extends ProductFactory2
{
@Override
public <T extends IProduct1> T create(Class<T> c)
{
IProduct1 product1=null;
try
{
product1=(IProduct1)Class.forName(c.getName()).newInstance();
} catch (Exception e)
{
}
return (T) product1;
}
}
然而需求是无止境的,甲方说:尼玛,你给的啥破品牌键鼠,我要的是赛睿的,赛睿的,赛睿的专用游戏鼠标
ok,好吧,需求变了,Mouse和键盘肯定不是赛睿的,添加新的2个产品类:SRMouse 和SRKeyboard,然后我们添加新的SRMouseFactory和SRKeyboardFactory 吗,万一需求又变成雷蛇的呢,那就只能说fuck了.(由此可见,普通工厂模式并不适用于产品族的创建)
需求变了,重新画图呗:
ok,现在就只想大声的对甲方说,来,需求你来,你给老子改;
扩展了需求,一旦添加雷蛇的需求,添加一个子类即可
interface IMouse2
{
}
interface IKeyboard2
{
}
class Mouse2 implements IMouse2
{
}
class KeyBoard2 implements IKeyboard2
{
}
abstract class AbstractProuctFactory
{
public abstract Mouse2 createMouse();
public abstract KeyBoard2 createKeyBoard();
}
class SRMKFactory extends AbstractProuctFactory
{
@Override
public Mouse2 createMouse()
{
return null;
}
@Override
public KeyBoard2 createKeyBoard()
{
return null;
}
}
抽象工厂模式更适用于创建产品族,当然普通工产模式也是可以的,外层在包裹一层父工厂即可
抽象工厂模式好比一个真实的工厂,而每个具体的工厂类(赛睿工厂)好比工厂中的车间,每个车间生产各自的产品族(但是每个车间的产品族总的是一样的:生产的都是鼠标键盘)