(创建型模式)工厂模式三种实现

65 阅读4分钟

工厂模式(Factory Pattern)

工厂模式分为

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

工厂模式一般用于创建一类对象,而不用每次在使用时通过new()对象才能使用对象,而是通过工厂来完成对象的创建,这样不但提供了统一创建对象的入口,而且对于程序的可维护和可测试性都有很大的提高。

前言

假如我们要对接电商平台(淘宝,京东,天猫...)去调用他们的api,他们都有上货,下架...相同的功能。

简单工厂模式

简单工厂又叫做静态工厂方法模式,简单工厂适用于工厂类负责创建的对象较少的场景,可以根据参数的不同返回不同类的实例。

使用示例

/**
 * 商品上架
 * @param code
 */
public void issue(String code){
    TerraceFactory terraceFactory = new TerraceFactory();
    ATerrace aTerrace = terraceFactory.getATerrace(code);
    aTerrace.issue();
}

顶层接口

/**
 * 电商需要的api接口
 */
public interface ATerrace {


    /**
     * 上架
     * @return
     */
    Boolean issue();

}

实现类

/**
 * 淘宝实现
 */
public class TbTerrace implements ATerrace{
    @Override
    public Boolean issue() {
        return null;
    }
}
/**
 * 天猫实现
 */
public class TmTerrace implements ATerrace{
    @Override
    public Boolean issue() {
        return null;
    }
}
/**
 * 京东实现
 */
public class JdTerrace implements ATerrace{
    @Override
    public Boolean issue() {
        return null;
    }

}
/**
 * 工厂实现
 */
public class TerraceFactory {
    
    public ATerrace getATerrace(String code){
        ATerrace aTerrace = null;
        if(code.equals("淘宝")){
            aTerrace = new TbTerrace();
        } 
        if(code.equals("天猫")){
            aTerrace = new TmTerrace();
        }
        if(code.equals("京东")){
            aTerrace = new JdTerrace();
        }
        return aTerrace;
    }
}

优化后使用

/**
 * 商品上架
 * @param code
 */
public void issue(String code){
    TerraceFactory terraceFactory = new TerraceFactory();
    ATerrace aTerrace = terraceFactory.getATerrace(code);
}

UML类结构图

截屏2022-08-07 21.13.12.png

总结

简单工厂模式代码简单,虽有多处if分支且违背开闭原则,但扩展性和可读性尚可,这样的代码在大多数情况下并无问题。

工厂方法模式

开闭原则指的是对修改关闭,对拓展开放,工厂方法模式就契合了这一点,提供了顶层的接口,每一个产品的生产都有自己的工厂。

使用示例

public static void main(String[] args) {
    //淘宝上架操作
    TbTerrace tbTerrace = new TbFactory().getTerrace();
    tbTerrace.issue();
    //天猫上架操作
    TmTerrace tmTerrace = new TmFactory().getTerrace();
    tmTerrace.issue();
    //京东上架操作
    JdTerrace jdTerrace = new JdFactory().getTerrace();
    jdTerrace.issue();
}

顶层工厂

//工厂方法
public interface MethodFactory {

    ATerrace getTerrace();


}

工厂实现

public class TbFactory implements MethodFactory {

    @Override
    public TbTerrace getTerrace() {
        return new TbTerrace();
    }
    
}
public class TmFactory implements MethodFactory{
    
    @Override
    public TmTerrace getTerrace() {
        return new TmTerrace();
    }
    
}
public class JdFactory implements MethodFactory{

    @Override
    public JdTerrace getTerrace() {
        return new JdTerrace();
    }
    
}

UML类结构图

20220809-185618.jpg

总结

对调用者屏蔽对象具体实现,调用者只需要关注接口,拓展性强,但是随着平台的增多大大增加了系统的复杂性,而且类也会越来越多。

抽象工厂模式

抽象工厂模式是工厂方法模式的升级版,工厂方法模式只生产一个等级的产品,而抽象工厂模式可以生产不同等级的产品。抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。

产品族和产品等级

比如华为手机和小米手机,通过上述工厂方法模式可以定义一个phoneFactroy,然后在又小米phone工厂和华为phone工厂去实现,如果这个时候又引入了华为平板和小米平板,又要去定义一个padFactory...
上述例子中,产品族就是同一个品牌有不同的产品,产品等级就是同一个产品有不同的品牌制造。

使用示例

public static void main(String[] args) {
    //小米手机
    IPhone phone = new XiaomiFactory().getPhone();
    phone.show();
    //华为平板
    IPad pad = new HuaweiFactory().getPad();
    pad.show();
}

抽象产品和实现

//手机产品
public interface IPhone {
    
    void show();
}
public class XiaomiPhone implements IPhone {
    @Override
    public void show() {
        System.out.println("小米手机");
    }
}
public class HuaweiPhone implements IPhone{
    @Override
    public void show() {
        System.out.println("华为手机");
    }
}
//平板产品
public interface IPad {
    void show();
}
public class XiaomiPad implements IPad{
    @Override
    public void show() {
        System.out.println("小米平板");
    }
}
public class HuaweiPad implements IPad{
    @Override
    public void show() {
        System.out.println("华为平板");
    }
}

抽象工厂和实现

public interface AbstractFactory {

    IPhone getPhone();

    IPad getPad();

}
public class XiaomiFactory implements AbstractFactory{
    @Override
    public IPhone getPhone() {
        return new XiaomiPhone();
    }

    @Override
    public IPad getPad() {
        return new XiaomiPad();
    }
}
public class HuaweiFactory implements AbstractFactory{
    @Override
    public IPhone getPhone() {
        return new HuaweiPhone();
    }

    @Override
    public IPad getPad() {
        return new HuaweiPad();
    }
}

UML类结构图

截屏2022-08-09 21.13.08.png

总结

扩展性高,可通过一组对象实现某个功能,如果没有应对多系列的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的工厂完全可以。