工厂模式【创建型模式】

一、引入工厂模式

假如我们有一个手机接口里面有一个打电话方法(call),它有两个实现类小米手机和华为手机。我们现在要去调用这两个实现类的call方法。

1-1:根据上面的说明写出代码

1-1-1: Phone

public interface Phone {
    void call();
}

1-1-2:XiaoMiPhone

public class XiaoMiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("使用小米手机打电话!");
    }
}

1-1-3:HuaWeiPhone

public class HuaWeiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("使用华为手机打电话");
    }
}

1-1-4:测试 Main

public class Main {

    public static void main(String[] args) {
        XiaoMiPhone xm = new XiaoMiPhone();
        HuaWeiPhone hw = new HuaWeiPhone();

        xm.call();
        hw.call();
    }
}

1-2:对上面代码分析

  • 我们主要目的是想得到一个对象,但是我们必须知道这个类的名字,如果还有参数的话。我们还要去写上它的参数。
  • 类的创建越复杂,我们使用这种方式创建起来就越麻烦。
  • 所以我们引入工厂模式,使用工厂来统一创建对象。



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

1-1:基本介绍

    简单工厂模式是属于创建型模式。定义了一个创建对象的类,由这个类来封装实例化对象的行为 (由这个类来代替我们去创建对象)


1-2:使用简单工厂模式解决上面的问题

    1、我们创建一个简单工厂 SimpleFactory

public class SimpleFactory {

    public static Phone getPhone(String type){

        if ("小米".equals(type)){
            return new XiaoMiPhone();
        }else if ("华为".equals(type)){
            return new HuaWeiPhone();
        }else {
            return null;
        }
    }
}

    1、使用简单工厂创建对象并调用

public class Main {

    public static void main(String[] args) {

       SimpleFactory.getPhone("小米").call();
       SimpleFactory.getPhone("华为").call();
    }
}

1-3:总结分析

  • 使用简单工厂创建对象,我们只要知道我们创建什么对象即可,不需要去关注创建的过程。
  • 但是如果我们现在新增一个一加手机呢?
    • 我们新建一个一加类,然后在简单工厂里面去新增一个 else if 即可。
    • 但是我们写代码有一个原则,开闭原则:新增功能的时候,不能去修改之前的代码



三、工厂方法模式

3-1:基本介绍

    定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类


3-2:使用工厂方法模式解决上面的问题

    1、创建一个工厂接口 PhoneFactory

public interface PhoneFactory {

     Phone getPhone();
}

    2、创建小米工厂、华为工厂

public class XiaoMiFactory implements PhoneFactory {

    @Override
    public Phone getPhone() {
        return new XiaoMiPhone();
    }
}
public class HuaWeiFactory implements PhoneFactory {

    @Override
    public Phone getPhone() {
        return new HuaWeiPhone();
    }
}

    3、测试

public class Main {

    public static void main(String[] args) {

        new XiaoMiFactory().getPhone().call();
        new HuaWeiFactory().getPhone().call();
    }
}

3-3:总结分析

  • 如果我们新增一加手机,那么我们只需要新增一个 YiJiaFactory implements PhoneFactory 类即可。
  • 使用工厂方法模式解决了新增的时候需要修改之前代码的问题。
  • 虽然看起来好像更加复杂了,但是如果代码很多的时候。后续维护性才是最重要的。



四、抽象工厂模式

    抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类

4-1、引入抽象工厂模式

上面我们两个厂商只有一个产品(手机),如果这个时候又多了一个比如耳机呢?
上面我们使用小米工厂(XiaoMiFactory )去实现手机工厂接口(PhoneFactory ),当然了Java是支持多实现的,我们可以再实现一个耳机工厂接口。
其实这个都不必解释了,肯定不合理的。如果1000个产品难道实现1000个嘛?
这个时候我们就要把这些抽象的工厂接口进行一个整合,把它放在一个产品接口里面去。再由我们的具体工厂比如小米工厂去实现它。

4-2、代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H7Dp8U10-1587481533633)(https://www.xdx97.com:8185/api/preview?url=uploads/ARTICLE/root/article/2020-04-21/xdx_gleR72bT8zGbRPjf.png)]

1、工厂接口

// 耳机工厂
public interface HeadSetFactory {

    void hear();
}

// 手机工厂
public interface PhoneFactory {

    void call();
}

// 产品接口
public interface ProductFactory {

    HeadSetFactory getHeadSet();

    PhoneFactory getPhone();
}

2、具体产品的实现 - 华为


// 华为耳机具体实现
public class HuaWeiHeadSet implements HeadSetFactory {
    @Override
    public void hear() {
        System.out.println("使用华为耳机听歌");
    }
}

// 华为手机具体实现
public class HuaWeiPhone implements PhoneFactory {
    @Override
    public void call() {
        System.out.println("使用华为手机打电话");
    }
}

// 华为工厂实现
public class HuaWeiFactory implements ProductFactory {
    @Override
    public HeadSetFactory getHeadSet() {
        return new HuaWeiHeadSet();
    }

    @Override
    public PhoneFactory getPhone() {
        return new HuaWeiPhone();
    }
}

3、具体产品实现 - 小米

// 小米耳机实现
public class XiaoMiHeadSet implements HeadSetFactory {
    @Override
    public void hear() {
        System.out.println("使用小米耳机听歌!");
    }
}

// 小米手机实现
public class XiaoMiPhone implements PhoneFactory {

    @Override
    public void call() {
        System.out.println("使用小米手机打电话!");
    }
}

// 小米工厂实现
public class XiaoMiFactory implements ProductFactory {

    @Override
    public HeadSetFactory getHeadSet() {
        return new  XiaoMiHeadSet();
    }

    @Override
    public PhoneFactory getPhone() {
        return new XiaoMiPhone();
    }
}

4、测试,结果就不放出来了,代码很简单没有意外。

public class Main {

    public static void main(String[] args) {

        new XiaoMiFactory().getPhone().call();
        new XiaoMiFactory().getHeadSet().hear();


        new HuaWeiFactory().getPhone().call();
        new HuaWeiFactory().getHeadSet().hear();
    }
}

抽象工厂还是不太好理解的,多看几遍。然后跟着敲一下,总结一下。

猜你喜欢

转载自blog.csdn.net/Tomwildboar/article/details/105670511