文章结构:意义是什么,解决了什么,实例,举例,图解+说明
意义:
提供一个创建一系列,相关或相互依赖的对象的接口,而无需指定他们具体的类。
解决:
解决了接口选择的问题
优点:
当整个产品中的多个对象被设计在一起工作时,他能保证客户端始终只使用同一个产品中的对象,就像是USB接口可以链接鼠标键盘,那你使用的鼠标键盘都是属于usb接口的,而DP和HDMI 链接显示器,也就是说当你使用显示器时,不会去链接USB接口
缺点:
当你增加一个USB接口的使用者时,你需要在抽象工厂里面添加一个对象,并且需要在创建一个接口,一系列对象,和在FactoryProduct工厂选择里面,增加一个返回值,相对来说比较麻烦
实例
步骤一:创建一个接口,并定义一个图形接口,当作基础接口
public interface Shape {
void draw();
}
步骤二: 创建三个 图形的实体类,并实现图形接口
长方形类
public class Rectange implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
正方形类
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
圆形类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
步骤三: 创建一个颜色接口,按照工厂模式创建就可以
public interface Color {
void fill();
}
步骤四: 创建颜色接口的具体实现类
颜色-红色
public class Red implements Color {
@Override
public void fill() {
System.out.println("Inside Red::fill() method.");
}
}
颜色-绿色
public class Blue implements Color {
@Override
public void fill() {
System.out.println("Inside Blue::fill() method.");
}
}
颜色-绿色
public class Green implements Color {
@Override
public void fill() {
System.out.println("Inside Green::fill() method.");
}
}
步骤五:为颜色和形状创建抽象工厂
这一步也是,抽象工厂和工厂设计模式做出区分的一个步骤,为color和shape对象创建抽象类来获取工厂。
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape) ;
}
步骤六:创建颜色和形状的工厂类
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
public class ColorFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
return null;
}
@Override
public Color getColor(String color) {
if(color == null){
return null;
}
if(color.equalsIgnoreCase("RED")){
return new Red();
} else if(color.equalsIgnoreCase("GREEN")){
return new Green();
} else if(color.equalsIgnoreCase("BLUE")){
return new Blue();
}
return null;
}
}
步骤7:创建一个工厂的创建其,通过传递对应信息,来获取工厂
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("SHAPE")){
return new ShapeFactory();
} else if(choice.equalsIgnoreCase("COLOR")){
return new ColorFactory();
}
return null;
}
}
步骤8:使用FactoryProducer(工厂的生产者) 来获取AbstractFactory(抽象工厂) ,通过传递类型信息,来获取实体类的对象。
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
//获取形状工厂
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
//获取形状为 Circle 的对象
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取形状为 Rectangle 的对象
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取形状为 Square 的对象
Shape shape3 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法
shape3.draw();
//获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
//获取颜色为 Red 的对象
Color color1 = colorFactory.getColor("RED");
//调用 Red 的 fill 方法
color1.fill();
//获取颜色为 Green 的对象
Color color2 = colorFactory.getColor("Green");
//调用 Green 的 fill 方法
color2.fill();
//获取颜色为 Blue 的对象
Color color3 = colorFactory.getColor("BLUE");
//调用 Blue 的 fill 方法
color3.fill();
}
}
图解和说明(图解-对应上面的例子,说明对应我自己举得例子)
整个抽象工厂设计模式的说明
1:我们按照抽象工厂的模式,创建两个接口A,B,和他们两个接口分别的实例,然后我们在创建一个抽象工厂类C,内部添加两个抽象方法返回值分别是A,B
2:我们再来创建A,B的抽象AF,BF整个抽象类
3:此时创建一个工厂产出类,D 用于获取对应的工厂
4:调用工厂产出类,获取图形/颜色的工厂(AF,BF) ,此时我们已经获取了对应的工厂,那么就可以利用工厂里面的方法获取对象实例,如获取了AF 那么AF.getShape("传入图形的类型")就获取了某个图形的实例。