抽象工厂模式

为什么引入抽象工厂模式?

一个接口代表一系列操作,当我们需要的对象需要多个接口,而这些接口又是不相干的,同时对于类的创建我们不需要知道具体的实现细节,只需要知道某个特征就可以,虽然工厂方法模式可以满足要求,但是工厂方法模式会让类本身实现很多不相关的操作,同时增加了对象内部的复杂性,我们需要一种从更高层来抽象,将接口分离,同时在创建对象的时候,又将不同接口之前操作进行组合的角色,这个就是抽象工厂模式。

抽象工厂模式是什么?

提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

核心思想:

在工厂模式的基础上,进行更高一层的抽象,将不同的接口进行组合,通过工厂,从而生成具有多个操作的具体实例,抽象工厂模式从顶层出发,我们先考虑生产生什么,然后再将对象的操作进行拆分,将相同的操作交给特定的厂商。

具体实例

我们现在需要定制一批电脑,委托A和B公司为我们生产,但是A和B公司会将不同的部件生产交给不同的工厂进行加工,到时候在运输过来进行组装。

UML:

具体代码:


package com.dong.AbstractFactory;
//工厂接口,可以理解总工厂
public interface Facotory{
	public Mouse createMouse();
	public KeyBoard createKeyBoard();
}

package com.dong.AbstractFactory;
//A工厂
public class AFactory implements Facotory {
	@Override
	public Mouse createMouse() {
		System.out.println("A Mouse");
		return new Amouse();
	}
	@Override
	public KeyBoard createKeyBoard() {
		System.out.println("A keyBoary");
		return new AkeyBoard();
	}
}

package com.dong.AbstractFactory;
//B工厂
public class BFactory implements Facotory {
	@Override
	public Mouse createMouse() {
		System.out.println("B mouse ");
		return new Bmouse();
	}
	@Override
	public KeyBoard createKeyBoard() {
		System.out.println("B keyBoard");
		return new BKeyBoard();
	}
}

package com.dong.AbstractFactory;
//鼠标接口,即包含键盘的一些属性和功能
public interface Mouse {
	public void brand();
}

package com.dong.AbstractFactory;
//键盘接口,即包含键盘的一些属性和功能
public interface KeyBoard {
	public void type();
}

package com.dong.AbstractFactory;
//A键盘生产商
public class AkeyBoard implements KeyBoard{
	@Override
	public void type() {
		System.out.println("A keyboard");
	}
}

package com.dong.AbstractFactory;
//A鼠标生产商
public class Amouse implements Mouse{
	@Override
	public void brand() {
		System.out.println("A mouse ");
	}
}

package com.dong.AbstractFactory;
//B鼠标生产商
public class Bmouse implements Mouse{
	@Override
	public void brand() {
		System.out.println("Bmouse");
	}
}

package com.dong.AbstractFactory;
//B键盘生产商
public class BKeyBoard implements KeyBoard {
	@Override
	public void type() {
		System.out.println("BKeyboard");
	}
}

package com.dong.AbstractFactory;
/**
 * 结果分析:
 *  A Mouse
	A keyBoary
	com.dong.AbstractFactory.Amouse@136432db
 * @author liuD
 *
 */
public class FactoryMain {
	public static void main(String[] args) {
		AFactory af = new AFactory();
		Mouse amouse =af.createMouse();
		KeyBoard akeyboard = af.createKeyBoard();

		System.out.println(amouse.toString() + akeyboard.toString());
	}
}

优点

实现了良好的框架结构,分离不相关的接口,

顶层设计不需关注具体实现,即具有良好的封装性,将具体生产交给具体的实现厂商,实现厂商又可以看做是一个使用工厂模式的例子,用来创建对象,只不过抽象工厂方法,将对象的同种操作,使用接口进行了统一和分离,使用的时候,只需进行组合即可。

缺点

不利于扩展,当我们要增加一个厂商时,我们需要改动实现接口的厂商,其次需要给每个接口增加实现类,当我们想要增加一个新的不同的对象时,这个对象和原来的厂商没有任何相同之处,当我们将其添加到抽象工厂类中时,所有的类,接口,都必须变动。

新的感悟:

例如,当我们想要生产鞋子,鞋子的种类很多,我们使用工厂模式进行生产,我们可以提供几个简单的提示,就可以利用工厂生产出我们需要的鞋子,例如我们需要运动鞋,我们告诉工厂运动,,需要帆布鞋,告诉工厂帆布就可以,这里只不过是一种生产对象的方式而已,别的方式也可以,重点在于,工厂模式的生产是基于一种单一的特性,我们只需要生产鞋子(假定鞋子的生产具有单一性)。

抽象工厂模式,在举个例子,当我们需要生产衣服,当这个对象可以进行拆分,当使用工厂模式,则会生产出A工厂的整套衣服,当然可以进行分开设计,让工厂生产出什么样的上衣,什么样的下衣,但是全都是由A工厂生产,如果A公司的是生产的上衣质量好,但是下衣质量不好,这个时候我们可以使用抽象工厂模式,即将上衣和下衣的生产承包给不同的公司,然后再在上层使用工厂模式进行组合即可。

抽象工厂模式,我的理解是,最大的好处是实现了工厂的定制,生产的选择和组合性。