【设计模式】抽象工厂模式

设计模式的分类:

        创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

        工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式

        结构型模式:这些模式关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构。

        适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式、代理模式

        行为型模式:这些模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。

        责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式

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

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

抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

适用场景:当系统需要创建多个相关或依赖的对象,而不需要指定具体类时

优点

  1. 确保同一产品族的对象一起工作。
  2. 客户端不需要知道每个对象的具体类,简化了代码。

缺点

扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。

使用场景

  1. QQ 换皮肤时,整套皮肤一起更换。
  2. 创建跨平台应用时,生成不同操作系统的程序。

结构

抽象工厂模式包含以下几个主要角色:

  • 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  • 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

实现:

1、创建Animal和Color接口

package org.example;

public interface Animal {
    void move();
}
package org.example;

public interface Color {
    void fill();
}

2、创建接口的实现类

package org.example;

public class Cat implements Animal{
    @Override
    public void move() {
        System.out.println("Cat类实现Animal接口");
    }
}
package org.example;

public class Bird implements Animal{

    @Override
    public void move() {
        System.out.println("Bird类实现Animal接口");
    }
}
package org.example;

public class White implements Color{

    @Override
    public void fill() {
        System.out.println("white实现Color接口");
    }
}
package org.example;

public class Black implements Color{

    @Override
    public void fill() {
        System.out.println("Black实现Color接口");
    }
}

3、为 Animal和 Color对象创建抽象类来获取工厂。

package org.example;

public class AnimalFactory extends MyFactory {

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

    @Override
    public Animal getType(String type) {
        if(type == null){
            return null;
        }
        if (type.equalsIgnoreCase("cat")) {
            return new Cat();
        }
        if (type.equalsIgnoreCase("bird")) {
            return new Bird();
        }
        return null;
    }
}
package org.example;

public class ColorFactory extends MyFactory{

    @Override
    public Color getColor(String color) {
        if(color == null){
            return null;
        }
        if (color.equalsIgnoreCase("white")) {
            return new White();
        }
        if (color.equalsIgnoreCase("black")) {
            return new Black();
        }
        return null;
    }

    @Override
    public Animal getType(String type) {
        return null;
    }
}

4、创建扩展了MyFactory 的工厂类(抽象类),基于给定的信息生成实体类的对象。

package org.example;

public abstract class MyFactory {
    public abstract Color getColor(String color);
    public abstract Animal getType(String type);
}

5、创建一个工厂创造器/生成器类,通过传递类型或颜色信息来获取工厂。

package org.example;

public class FactoryProducer{
    public static MyFactory getFactory(String factory){
        if(factory.equalsIgnoreCase("animal")){
            return new AnimalFactory();
        } else if (factory.equalsIgnoreCase("color")) {
            return new ColorFactory();
        }
        return null;
    }
}

6、使用 FactoryProducer 来获取 MyFactory,通过传递类型信息来获取实体类的对象。

package org.example;

public class Main {
    public static void main(String[] args) {

        MyFactory shapeFactory = FactoryProducer.getFactory("animal");

        Animal shape1 = shapeFactory.getType("cat");
        shape1.move();

        Animal shape2 = shapeFactory.getType("bird");
        shape2.move();


        MyFactory colorFactory = FactoryProducer.getFactory("color");

        Color color1 = colorFactory.getColor("white");
        color1.fill();

        Color color2 = colorFactory.getColor("black");
        color2.fill();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值