小言_互联网的博客

创建型模式—抽象工厂模式

456人阅读  评论(0)

一、介绍

介绍:
抽象工厂模式(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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场