设计模式之工厂模式

本文详细介绍了三种工厂模式:简单工厂、工厂方法和抽象工厂。简单工厂模式通过静态方法创建对象,适用于简单场景,但扩展性较差。工厂方法模式引入了抽象工厂类和具体产品工厂,提高了灵活性,但类数量增多。抽象工厂模式用于创建相关对象族,当产品族扩展时,需修改所有工厂类。
摘要由CSDN通过智能技术生成

简单工厂模式(静态工厂模式)

UML类图:

在这里插入图片描述


特点:
1.非接口/抽象类,定义create()方法,利用if/switch创建对象并返回
2.create()方法通常是静态的(static修饰),所以也叫静态工厂

以创建产品为例:

public interface Product {
    //声明类所需继承的共同接口,也可以是抽象类
}

public class ProductOne implements Product {
    
}

public class ProductTwo implements Product {
    
}


public class SimpleFactory {
    public static Product createProduct(ProductTypeEnum type) {
        if (ProductTypeEnum.one.equals(type)) {
            return new ProductOne();
        } else if (ProductTypeEnum.two.equals(type)) {
            return new ProductTwo();
        }
        return null;
    }
}

public class Client {
     public static void main(String[] args) {
         //调用Factory的静态方法生成所要的类
         SimpleFactory.createProduct(ProductTypeEnum.one);
         SimpleFactory.createProduct(ProductTypeEnum.two);
     }
 }

使用反射机制实现:

public class SimpleFactoryReflection {
    private static final Map<ProductTypeEnum, Class> productMap = new HashMap<>();
    ;

    public static void addProductKey(ProductTypeEnum typeEnum, Class product) {
        projectMap.put(typeEnum, product);
    }

    public static ProductOne getProduct(Product typeEnum) throws InstantiationException, IllegalAccessException {
        Class productClass = productMap.get(typeEnum);
        return (ProductOne) productClass.newInstance();
    }
}

缺点:
1.扩展性差(每增加一种产品都要去修改createProduct方法)
2.不同产品需要不同额外参数时不支持

工厂方法模式

UML类图:

在这里插入图片描述

特点:
1.提供产品类接口和工厂类接口(也可以是抽象类,即抽象产品和抽象工厂)
2.不同产品由不同工厂实现类实例化

抽象化工厂类:

public abstract class FactoryMethod {
    protected abstract Product createProduct();
}

再创建具体产品工厂类继承 抽象工厂类,实现createProduct方法

public class FactoryOne extends FactoryMethod {
    @Override
    protected Product createProduct() {
        return new ProductOne();
    }
}
public class FactoryTwo implements FactoryMethod {
    @Override
    protected Product createProduct() {
        return new ProductOTwo();
    }
}
    

缺点:
1.类的数量过多,增加复杂度和理解难度
2.抽象产品只能生产一种产品

抽象工厂模式

UML类图:

在这里插入图片描述

特点:抽象工厂模式是工厂方法模式的升级版本,用来创建一组相关或者相互依赖的对象

例:不同商品赠送不同礼物,创建Gift接口

public interface Gift {
     //声明产品赠品的接口,当然也可以是抽象类
}

//ProductOne的礼物
public class GiftOne implements Gift {
     public GiftOne() {
        System.out.println("GiftOne");
     }
}

//ProductTwo的礼物
public class GiftTwo implements Gift {
     public GiftTwo() {
        System.out.println("GiftTwo");
     }
}
public interface Factory {
    public Product createProduct();
    public Gift createGift();
}

public class FactoryA implements Factory {
    @Override
    public Product createProduct() {
       return new ProductA();
    }
    @Override
    public Gift createGift() {
        return new GiftA();
    }
}

public class FactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
    @Override
    public Gift createGift() {
       return new GiftB();
    }
}

缺点:当产品族中新增一个产品时,所有工厂类都需要进行修改,增加系统抽象性和理解难度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

07feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值