一、介绍
介绍:
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于对象创建型模式,它提供了一种创建对象的最佳方式。
定义:
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们
具体的类。抽象工厂模式又称为Kit模式。
二、特点
优点:
- 抽象工厂模式隔离了具体类的生成, 客户不需要知道什么被创建。
- 横向扩展容易:同个产品族如果需要增加多个产品,只需要增加新的工厂类和产品类即可, 符合“开闭原则”。
缺点:
- 扩展新产品时,除了增加新产品类外,还要增加与之对应的具体工厂类,类的个数将成对增加,一定程度上增加了系统的复杂度;同时有更多的类需要编译和运行,会给系统带来一些额外的开销;
- 考虑到系统的可扩展性,引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度;
三、使用场景
- 一个系统不应当依赖于具体类实例如何被创建、 组合和表达的细节, 用户无须关心对象的创建过程, 将对象的创建和使用解耦
例如: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
四、角色
抽象类接口: 提供一组所有类都具有的业务方法
抽象类: 对于抽象接口定义的方法只定义为抽象方法,具体实现全部交给具体类。引入该角色是为了根据声明不同的抽象类,将类区分为不同的等级结构
具体类: 继承抽象类,实现抽象类中声明的抽象方法,完成不同等级结构,不同族的业务方法的具体实现
抽象工厂: 声明一组用于创建一族产品的方法,每个方法对应一种对象;抽象工厂可以是接口, 也可以是抽象类
具体工厂: 具体工厂实现了抽象工厂,每个工厂方法返回一个具体对象,一个具体工厂所创建的具体对象构成一个族。
五、实战代码
用户的要求创建不同的形状、不同颜色的图形,比如红色的圆形、蓝色的长方形
目录结构:
步骤1. 创建图形接口和图形抽象类
【Shape.java】
package Shape;
//抽象工厂模式
//形状公共接口
public interface Shape {
void draw();
}
【Rectange.java】
package Shape;
//抽象工厂模式
//长方形抽象类
public abstract class Rectange implements Shape{
public abstract void draw();
}
【Circle .java】
package Shape;
//抽象工厂模式
//圆形抽象类Circle
public abstract class Circle implements Shape{
public abstract void draw();
}
步骤2. 创建工厂接口和抽象类
【ShapeFactory .java】
package ShapeFactory;
//抽象工厂模式
//图形绘制工厂的接口 ShapeFactory
import Shape.Shape;
public interface ShapeFactory {
Shape getCircle();
Shape getRectange();
}
【RedShapeFactory .java】
package ShapeFactory;
//抽象工厂模式
//红色图形绘制工厂
import ConcreteShape.RedCircle;
import ConcreteShape.RedRectange;
import Shape.Shape;
public class RedShapeFactory implements ShapeFactory{
@Override
public Shape getCircle() {
return new RedCircle();
}
@Override
public Shape getRectange() {
return new RedRectange();
}
}
【BlueShapeFactory .java】
package ShapeFactory;
//抽象工厂模式
//蓝色图形绘制工厂
import ConcreteShape.BlueCircle;
import ConcreteShape.BlueRectange;
import Shape.Shape;
public class BlueShapeFactory implements ShapeFactory{
@Override
public Shape getCircle() {
return new BlueCircle();
}
@Override
public Shape getRectange() {
return new BlueRectange();
}
}
步骤3. 创建具体图形产品类
【RedCircle .java】
package ConcreteShape;
//抽象工厂模式
//具体颜色的Rectange实现
import Shape.Circle;
public class RedCircle extends Circle {
@Override
public void draw() {
System.out.println("绘制红色的圆");
}
}
【RedRectange .java】
package ConcreteShape;
//抽象工厂模式
//具体颜色的Rectange实现
import Shape.Rectange;
public class RedRectange extends Rectange {
@Override
public void draw() {
System.out.println("绘制红色长方形");
}
}
【BlueCircle .java】
package ConcreteShape;
//抽象工厂模式
//具体颜色的Circle实现
import Shape.Circle;
public class BlueCircle extends Circle {
@Override
public void draw() {
System.out.println("绘制蓝色的圆");
}
}
【BlueRectange .java】
package ConcreteShape;
//抽象工厂模式
//具体颜色的Rectange实现
import Shape.Rectange;
public class BlueRectange extends Rectange {
@Override
public void draw() {
System.out.println("绘制蓝色的长方形");
}
}
步骤4. 客户端调用
【Test .java】
package Test;
//抽象工厂模式
//测试
import Shape.Shape;
import ShapeFactory.RedShapeFactory;
import ShapeFactory.ShapeFactory;
public class Test {
public static void main(String[] args) {
ShapeFactory redShapeFactory = new RedShapeFactory();
Shape circle = redShapeFactory.getCircle();
circle.draw();
Shape rectangle = redShapeFactory.getRectange();
rectangle.draw();
}
}
运行截图:
转载:https://blog.csdn.net/Da_Xiong000/article/details/105820380
查看评论