JAVA 工厂模式-工厂方法模式

提出问题

简单工厂的缺点:当新增加一个商品时,就需要修改工厂类,如何避免?

分析

使用 工厂方法模式

工厂方法模式

创建一个工厂接口,创建多个工厂实现类,每个工厂只生成 一类/一种 商品

优点

当需要 生成一个新商品时,直接 增加 新的工厂实现类 就可以了,不需要修改其他的代码

符合开放-封闭原则

缺点

对于某些可以形成产品族(一组产品)的情况,生产这类商品比较复杂。

案例

定义“产品”接口:

public interface InterPhone {

    public void call(String num);
    public void about();
}

定义若干 “产品”接口实现类

class IPhone implements InterPhone{
    String name;
    String cpu;
    int rom;
    int ram;
    int battery;

    @Override
    public void call(String num) {
        System.out.println("用iphone打电话给 "+num);
    }

    @Override
    public void about() {
        System.out.println("配置是:");
        System.out.println("name:"+name);
        System.out.println("cpu:"+cpu);
        System.out.println("rom:"+rom);
        System.out.println("ram:"+ram);
        System.out.println("battery:"+battery);
    }
}
class MiPhone implements InterPhone{
    String name;
    String cpu;
    int rom;
    int ram;
    int battery;

    @Override
    public void call(String num) {
        System.out.println("用小米打电话给 "+num);
    }
    @Override
    public void about() {
        System.out.println("配置是:");
        System.out.println("name:"+name);
        System.out.println("cpu:"+cpu);
        System.out.println("rom:"+rom);
        System.out.println("ram:"+ram);
        System.out.println("battery:"+battery);
    }
}

定义工厂接口

public interface InterPhoneFactory {
    InterPhone create();
}

定义生产iphone的工厂实现类

当生成一种新商品时,如:iphone11,就创建相应的工厂实现类

public class IPhoneFactory implements InterPhoneFactory {
    @Override
    public InterPhone create() {
        IPhone phone = new IPhone();
        phone.name="iphone11";
        phone.cpu="A13";
        phone.rom=64;
        phone.ram=2;
        phone.battery=3000;
        return phone;
    }
}

定义生产小米的工厂实现类

当生成一种新商品时,如:小米9,就创建相应的工厂实现类

public class MiPhoneFactory implements InterPhoneFactory {
    @Override
    public InterPhone create() {
        MiPhone phone = new MiPhone();
        phone.name="小米9";
        phone.cpu="骁龙855";
        phone.rom=256;
        phone.ram=16;
        phone.battery=5000;
        return phone;
    }
}

测试

public class Main {
    public static void main(String[] args) {
        // 创建IPhone 工厂
        InterPhoneFactory iPhoneFactory = new IPhoneFactory();
        // 通过 IPhone 工厂生成手机
        InterPhone iphone11 = iPhoneFactory.create();
        iphone11.about();

        System.out.println("------------");
        // 创建IPhone 工厂
        InterPhoneFactory miFactory = new MiPhoneFactory();
        // 通过 miFactory 工厂生成手机
        InterPhone miPhone9 = miFactory.create();
        miPhone9.about();
    }
}

优缺点

好处

遵循开闭原则,创建新商品时,不需要修改原来的代码

缺点

创建产品族(一组产品 或 一系列产品,如:iphone充电器、iphone保护膜、iphone手机壳,小米充电器、小米保护膜、小米手机壳等),需要定义非常多的工厂

参考:
https://www.cnblogs.com/geek6/p/3951677.html


原文出处:/show_1IX4eE3r9KJS.html