设计模式-抽象工厂模式 with 工厂模式

抽象工厂模式是以产品族为基准的,何为产品族呢,就是多个产品合成一个产品,如键鼠套装(键盘加鼠标),这就是一个简单的产品族.而抽象工厂模式就是用来生产这些相似的产品族的.

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;
	}
	
}

抽象工厂模式更适用于创建产品族,当然普通工产模式也是可以的,外层在包裹一层父工厂即可

抽象工厂模式好比一个真实的工厂,而每个具体的工厂类(赛睿工厂)好比工厂中的车间,每个车间生产各自的产品族(但是每个车间的产品族总的是一样的:生产的都是鼠标键盘)

猜你喜欢

转载自blog.csdn.net/Coder_Joker/article/details/80638752