简介
抽象工厂:抽象产品,具体产品,抽象工厂,具体工厂。
但是抽象工厂多出了产品族,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
产品族:个人理解就是同一类产品,而抽象工厂能生产多类产品。
类图
代码
/**
* 抽象工厂-产品族-抽象产品
* 圆形
* @author: 张彬
* @date: 2018年3月22日 下午2:44:27
* @version: V1.0
* @review: 张彬/2018年3月22日 下午2:44:27
*/
public interface Circle {
public void draw();
}
/**
* 抽象工厂-产品族-具体产品
* 绿圆形
* @author: 张彬
* @date: 2018年3月22日 下午3:07:48
* @version: V1.0
* @review: 张彬/2018年3月22日 下午3:07:48
*/
public class GreenCircle implements Circle {
@Override
public void draw() {
System.out.println("in GreenCircle::draw() method.");
}
}
/**
* 抽象工厂-产品族-具体产品
* 红圆形
* @author: 张彬
* @date: 2018年3月22日 下午3:07:48
* @version: V1.0
* @review: 张彬/2018年3月22日 下午3:07:48
*/
public class RedCircle implements Circle {
@Override
public void draw() {
System.out.println("in RedCircle::draw() method.");
}
}
/**
* 抽象工厂-产品族-抽象产品
* 矩形
* @author: 张彬
* @date: 2018年3月22日 下午2:44:27
* @version: V1.0
* @review: 张彬/2018年3月22日 下午2:44:27
*/
public interface Rectangle {
public void draw();
}
/**
* 抽象工厂-产品族-具体产品
* 绿矩形
* @author: 张彬
* @date: 2018年3月22日 下午2:46:10
* @version: V1.0
* @review: 张彬/2018年3月22日 下午2:46:10
*/
public class GreenRectangle implements Rectangle {
@Override
public void draw() {
System.out.println("in GreenRectangle::draw() method.");
}
}
/**
* 抽象工厂-产品族-具体产品
* 红矩形
* @author: 张彬
* @date: 2018年3月22日 下午2:46:10
* @version: V1.0
* @review: 张彬/2018年3月22日 下午2:46:10
*/
public class RedRectangle implements Rectangle {
@Override
public void draw() {
System.out.println("in RedRectangle::draw() method.");
}
}
/**
* 抽象工厂-抽象工厂
* @author: 张彬
* @date: 2018年3月22日 下午4:05:24
* @version: V1.0
* @review: 张彬/2018年3月22日 下午4:05:24
*/
public interface AbstractFactory {
Circle getCircle();
Rectangle getRectangle();
}
/**
* 抽象工厂-具体工厂
* 生产红色图形
* @author: 张彬
* @date: 2018年3月22日 下午3:15:59
* @version: V1.0
* @review: 张彬/2018年3月22日 下午3:15:59
*/
public class RedShapeFactory implements AbstractFactory{
@Override
public RedCircle getCircle() {
return new RedCircle();
}
@Override
public RedRectangle getRectangle() {
return new RedRectangle();
}
}
/**
* 抽象工厂-具体工厂
* 生产绿色图形
* @author: 张彬
* @date: 2018年3月22日 下午3:15:59
* @version: V1.0
* @review: 张彬/2018年3月22日 下午3:15:59
*/
public class GreenShapeFactory implements AbstractFactory{
@Override
public GreenCircle getCircle() {
return new GreenCircle();
}
@Override
public GreenRectangle getRectangle() {
return new GreenRectangle();
}
}
/**
* 客户端-测试
* @author: 张彬
* @date: 2018年3月22日 下午3:04:34
* @version: V1.0
* @review: 张彬/2018年3月22日 下午3:04:34
*/
public class AbstractFactoryDemo {
public static void main(String[] args) {
AbstractFactory greenShapeFactory = new GreenShapeFactory();
greenShapeFactory.getCircle().draw();;
greenShapeFactory.getRectangle().draw();
AbstractFactory redShapeFactory = new RedShapeFactory();
redShapeFactory.getCircle().draw();;
redShapeFactory.getRectangle().draw();
}
}
输出结果:
in GreenCircle::draw() method.
in GreenRectangle::draw() method.
in RedCircle::draw() method.
in RedRectangle::draw() method.
工厂模式总结。
工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。- 简单工厂模式,相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。如果增加一个产品,要修改工厂类,不符合开闭原则。
- 工厂方法模式,相当于在简单工厂模式的基础上增加一个抽象工厂,如果增加一个产品,只需要增加具体工厂和具体产品即可。对一种产品的等级模式,生成某一种基类下的对象。
- 抽象工厂模式,可应对多种产品等级模式,引入产品族,类似于一个集团旗下生产的各种产品的工厂,这些产品是一个产品族。是在工厂方法下的扩展,可生成多种基类下的对象。