设计模式之抽象工厂模式

什么是抽象工厂模式

       抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

       在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

我个人理解就是抽象工厂就是工厂模式的一个升级版,工厂模式是一个工厂里生产对象,而抽象工厂模式就是生产工厂的工厂,相当于一个超级工厂,超级工厂包含好多工厂。举个例子就是:比如nike、特步,他们都属于生产球鞋的厂商,但是nike是nike厂商,特步是特步厂商,意思就是nike厂商生产的属于nike,特步厂商生产的属于特步。宏观的讲就是一个大的产品组下又包含好多产品

如有偏差,请多指教!!

目的

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

主要解决

主要解决接口选择的问题。

使用时机

系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决

在一个产品族里面,定义多个产品。

优点

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点

产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

注意事项

产品族难扩展,产品等级易扩展。

Demo

  1. 创建接口(可以理解为总的类型的一个分类,也是封装、继承、多态的体现)
/**
 * 为颜色创建一个接口
 */
public interface Color {
    void fill();
}
/**
 1. 为形状创建一个接口
 */
public interface Shape {
    void draw();
}
  1. 实现接口
/**
 * 创建实现形状接口的实体类
 */
public class Rectangle implements Shape
{
    @Override
    public void draw() {
        System.out.println("Rectangle :-----draw()");
    }
}
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Square:-----draw()");
    }
}
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Circle:----draw()");
    }
}
/**
 * 创建实现颜色接口的实体类
 */
public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Color:----fill()");
    }
}

public class Green implements Color {
    @Override
    public void fill() {
        System.out.println("Color:----fill()");
    }
}

public class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("Color:----fill()");
    }
}
  1. 为color和shape对象创建抽象类来获取工厂
/**
 * 为color和shape对象创建抽象类来获取工厂
 */
public abstract class AbstractFactory {

    //获取工厂
    public abstract Shape getShape(String shape);
    //获取工厂
    public abstract Color getColor(String color);
}

  1. 创建了扩展了AbstractFactory的工厂类信息,基于给定的信息生成实体类的对象
/**
 * 创建了扩展了AbstractFactory的工厂类信息,基于给定的信息生成实体类的对象
 */
public class ColorFactory extends AbstractFactory {
    @Override
    public Shape getShape(String shape) {
        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;
    }
}
/**
 * 创建了扩展了AbstractFactory的工厂类信息,基于给定的信息生成实体类的对象
 */
public class ShapeFactory extends AbstractFactory {
    @Override
    public Shape getShape(String shape) {
        if(shape == null){
            return null;
        }
        if(shape.equalsIgnoreCase("Ractangle")){
            return new Rectangle();
        }else if(shape.equalsIgnoreCase("Square")){
            return new Square();
        }else if(shape.equalsIgnoreCase("Circle")){
            return new Circle();
        }
        return null;
    }

    @Override
    public Color getColor(String color) {
        return null;
    }
}

  1. 工厂生产者类
/**
 1. 工厂生产者
 */
public class FactoryProducer {
    /**
     * 通过类型获得对应的工厂
     * @param choice 选择类型
     * @return 返回对应的工厂
     */
    public static AbstractFactory getFactory(String choice){
        if(choice.equalsIgnoreCase("Shape")){
            return new ShapeFactory();
        }else if(choice.equalsIgnoreCase("Color")){
            return new ColorFactory();
        }
        return null;
    }
}
  1. 测试结果
/**
 1. 抽象工厂模式Demo
 */
public class AbstractFactoryDemo {
    public static void main(String[] args) {

        //通过传入类型获取对应的工厂
        AbstractFactory shapeFactory  = FactoryProducer.getFactory("shape");
        //传入所需对象类型获取对象
        Shape ractangle = shapeFactory.getShape("Ractangle");
        //调用Ractangle的draw();
        ractangle.draw();

        //获取形状为Circle的对象
        Shape circle = shapeFactory.getShape("Circle");
        //调勇Circle的draw()
        circle.draw();

        //获取形状为Square的对象
        Shape square = shapeFactory.getShape("Square");
        //调勇Square的draw()
        square.draw();

        //获取颜色工厂
        AbstractFactory colorFactory = FactoryProducer.getFactory("color");
        //获取红颜色的对象
        Color color = colorFactory.getColor("Red");
        //调用红颜色的fill()
        color.fill();

        //获取绿颜色的对象
        Color green = colorFactory.getColor("Green");
        //调用绿颜色的fill()
        green.fill();

        //获取蓝颜色的对象
        Color blue = colorFactory.getColor("Blue");
        //调用蓝颜色的fill()
        blue.fill();

    }
}
  1. 结果输出
    在这里插入图片描述
    今天学到了2/23的抽象工厂模式,兄弟们,撸起来!!!在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值