Java设计模式之创建型模式--工厂方法及抽象工厂模式

本文对比分析了工厂方法模式和抽象工厂模式的应用场景与实现方式,详细解释了两种模式的具体实现,并通过示例代码展示了如何根据需求选择合适的模式。

一:工厂方法

1.我们先看类图

这里写图片描述

2.工厂方法是针对每一种产品提供一个工厂类,比如我是生产A类产品的,但是A类产品又分为google旗下和华为旗下,这是我需要提供两个工厂,每个工厂生产属于自己的产品A。
3.关于工厂,还有一个简单工厂就不介绍了,它只是在创建产品A的时候,传入不同的参数加以识别,从而创建相应的产品。在这里就不演示了。
4.工厂方法的代码如下:
//创建产品基类
public interface ProdcutA {
    void getName();
}
//创建Google和华为旗下的产品
public class GoogleProductA implements ProdcutA {
    @Override
    public void getName() {
        System.out.println("google公司下的产品A");
    }
}
public class HuaWeiProductA implements ProdcutA {
    @Override
    public void getName() {
        System.out.println("华为公司下的产品A");
    }
}
//紧接着,我们定义一个生产产品A的工厂
public interface IFactory {
    ProdcutA createProductA();
}
//创建Google和华为工厂

public class GoogleFatory implements IFactory {
    @Override
    public ProdcutA createProductA() {
        return new GoogleProductA();
    }
}
public class HuaWeiFatory implements IFactory {
    @Override
    public ProdcutA createProductA() {
        return new HuaWeiProductA();
    }
}
//测试
 public static void main(String[] args) {
        ProdcutA prodcutA;
        //创建google工厂
        IFactory factory = new GoogleFatory();
        //google工厂生产产品A
        prodcutA = factory.createProductA();
        prodcutA.getName();
        //创建华为工厂
        factory = new HuaWeiFatory();
        //华为工厂生产产品A
        prodcutA = factory.createProductA();
        prodcutA.getName();
    }
    //结果
    google公司下的产品A
    华为公司下的产品A
5.小结
所以对于工厂方法,我们可以增加同一等级下的任意产品,比如这是我们又需要增加OPPO公司下的产品A,这时,我们只需创建OPPO下的产品A和OPPO工厂即可,不需要修改原有的类。但是工厂方法只局限于同一等级的产品。如果我们需要每个公司都要生产产品A,B。(比如A表示手机,B表示汽车)他们属于不同等级的。那么我们用工厂方法无法实现,这时我们就需要抽象工厂来实现了。下面介绍一下抽象工厂。

二:抽象工厂模式

1.我们还是先看类图

这里写图片描述

2.抽象工厂是针对产品族而生,我们可以创建A,B…一系列的产品,我们可以很容易的增加产品线。比如原本Google只生产产品A,当Google能生产产品B时,这时我们只需新建一个Google产品B的工厂就行了。不需要修改IFactory中的任何东西。
3.下面看一下源码:
//创建产品
//产品A,产品A与上述一致
//产品B
public interface ProdcutB {
    void getName();
}
//具体的产品
public class GoogleProductB implements ProdcutB {
    @Override
    public void getName() {
        System.out.println("google公司下的产品B");
    }
}
public class HuaWeiProductB implements ProdcutB {
    @Override
    public void getName() {
        System.out.println("华为公司下的产品B");
    }
}
//创建工厂
//首先是抽象工厂,提供生产产品A,B的方法
public interface IFactory {
    ProdcutA createProductA();
    ProdcutB createProductB();
}
//接着创建具体的工厂,google工厂和华为工厂
public class GoogleFatory implements IFactory {
    @Override
    public ProdcutA createProductA() {
        return new GoogleProductA();
    }
    @Override
    public ProdcutB createProductB() {
        return new GoogleProductB();
    }
}
public class HuaWeiFatory implements IFactory {
    @Override
    public ProdcutA createProductA() {
        return new HuaWeiProductA();
    }
    @Override
    public ProdcutB createProductB() {
        return new HuaWeiProductB();
    }
}
//测试
public static void main(String[] args) {
        //工厂
        IFactory factory;
        //产品A
        ProdcutA prodcutA;
        //产品B
        ProdcutB prodcutB;
        //创建google工厂
        factory = new GoogleFatory();
        //google工厂生产产品A和B
        prodcutA = factory.createProductA();
        prodcutB = factory.createProductB();
        prodcutA.getName();
        prodcutB.getName();
        //创建华为工厂
        factory = new HuaWeiFatory();
        //华为工厂生产产品A和B
        prodcutA = factory.createProductA();
        prodcutB = factory.createProductB();
        prodcutA.getName();
        prodcutB.getName();
    }
    //结果
    google公司下的产品A
    google公司下的产品B
    华为公司下的产品A
    华为公司下的产品B
4.小结
前面也说了,抽象工厂是针对产品族的。虽然我们能很好的处理新的产品族,如果我们新增一类产品C,我们还是没有办法去不修改基类的情况来实现,但这样又违背开闭原则(OCP),所以,这也是抽象工厂的缺点之一。

三:总结

简单工厂实用性实在太低了,所以一般我们也会选择工厂方法/抽象工厂。因为简单工厂动不动就违背了开闭原则。对于工厂方法和抽象工厂,我们视情况而用,如果只是生产这一类的产品(如不同公司下的产品A),那么我们就选用工厂方法;如果是一系列的产品(如不同公司下的产品A,B...),那么我们选用抽象工厂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值