3.工厂模式

目录

简介

实际案例

简单工厂模式

1. 新建接口 IPhone.interface 作为手机基类(也可以是抽象类),提供手机公共属性:玩游戏功能

2. 创建 XiaomiPhone.class 类实现 IPhone 接口

3. 创建 HuaweiPhone.class 类实现 IPhone 接口

4. 创建 PhoneFactory.class 工厂类,提供静态创建手机的方法

5. 创建 Jingdong.class 实现订购手机业务,Taobao.class 代码与之一样

简单工厂模式总结

工厂方法模式

1. 创建 IPhoneFactory.interface 手机基类

2. 创建 XiaomiFactory.class 实现 IPhoneFactory 接口,提供实例化手机的具体方法

3. 创建 HuaweiFactory.class 实现 IPhoneFactory 接口,提供实例化手机的具体方法

4. 创建 Jingdond.class,提供订购不同类型手机的方法,Taobao.class 代码与之一样

工厂方法模式总结

抽象工厂模式

1. 创建 IPc.interface 电脑基类

2. 创建 XiaomiPc.class 实现 IPc 接口,HuaweiPc.class 代码与之类似

3. 创建 IFactory.interface 基类,提供创建手机和电脑的方法

4. 在 XiaomiFactory.class 和 HuaweiFactory.class 实现 IFactory 接口,实现具体创建逻辑

5. 在 Jingdond.class 和 Taobao.class 中提供不同品牌的订购方法

抽象工厂模式总结


简介

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一;这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式;在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象;工厂模式是一种设计思想,让代码扩展性更好,便于二次开发维护,缺点是增加了代码量和复杂度;工厂模式主要分为:简单工厂模式,工厂方法模式,抽象工厂模式;

实际案例

这里参考网上赫连小伍的文章,以用户订购手机为例,用户可在京东和淘宝上订购手机,手机种类分为华为和小米,手机有一个基本功能打游戏;如果我们不使用工厂模式,按照一般想法,那么京东和淘宝中会存在这么一段相同的代码

public class Jingdong {
    public void order(String type) {
        Phone phone = null;
        if ("huawei".equals(type)) {
            phone = new Huawei();
            phone.play();
        } else if ("xiaomi".equals(type)) {
            phone = new Xiaomi();
            phone.play();
        } else {
            System.out.println("暂不支持");
        }
    }
}

如果后期需要扩展新的手机种类或添加新的购物平台,那么这段相同的代码就会被修改多次,这显然增加了维护复杂度,也违背了迪米特法则;我们以此案例使用工厂模式修改代码演示效果;

简单工厂模式

  • 简单工厂模式是属于创建型模式,是工厂模式的一种;简单工厂模式由一个工厂对象决定创建出哪一种产品类的实例;简单工厂模式是工厂模式中最简单实用的模式,也叫做静态工厂模式
  • 简单工厂模式主要是通过定义一个创建对象的类,由这个类来封装实例化对象的行为(代码)
  • 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就可使用工厂模式

示例代码

思路:新建工厂类,封装手机创建过程,根据传入的参数创建不同的手机

1. 新建接口 IPhone.interface 作为手机基类(也可以是抽象类),提供手机公共属性:玩游戏功能

/**
 * 手机基类
 */
public interface IPhone {
    void play();
}

2. 创建 XiaomiPhone.class 类实现 IPhone 接口

/**
 * 小米手机
 */
public class XiaomiPhone implements IPhone {
    @Override
    public void play() {
        System.out.println("使用小米手机玩游戏");
    }
}

3. 创建 HuaweiPhone.class 类实现 IPhone 接口

/**
 * 华为手机
 */
public class HuaweiPhone implements IPhone {
    @Override
    public void play() {
        System.out.println("使用华为手机玩游戏");
    }
}

4. 创建 PhoneFactory.class 工厂类,提供静态创建手机的方法

/**
 * 创建手机实例工厂类
 */
public class PhoneFactory {
    public IPhone createPhone(String type) {
        IPhone phone = null;
        if (type.equals("xiaomi")) {
            phone = new XiaomiPhone();
        } else if (type.equals("huawei")) {
            phone = new HuaweiPhone();
        } else {
            System.out.println("不支持的手机种类");
        }
        return phone;
    }
}

5. 创建 Jingdong.class 实现订购手机业务,Taobao.class 代码与之一样

/**
 * 京东商城
 */
public class Jingdong {
    public void order(String type) {
        IPhone phone = PhoneFactory.createPhone(type);
        if(null != phone) {
            phone.play();
        }
    }
}

简单工厂模式总结

  • 简单工厂模式就是创建一个工厂类,根据传入的参数类型来创建具体的产品对象,并返回产品对象的实例;主要适用于调用者不知道应该创建哪个具体的对象,只能根据传入的条件返回相应对象的场景
  • 比如案例中,订购类是不知道要创建哪个手机对象的,只能根据用户提供的条件才能知道需要哪个手机对象
  • 简单工厂模式的好处在于将对象的创建过程和使用过程进行解耦,减少新增具体产品时修改代码的复杂度

工厂方法模式

如果现在需要添加更多的手机种类,那么我们就需要在简单工厂模式中继续添加 if ... else 判断,随着后期手机种类的扩展,手机初始化条件的增多,代码会越来越多,逻辑也会越来越复杂;简单工厂模式就无法满足要求了,所以我们换一个思路:如果用户要买的是华为手机,那么专门由创建华为手机的工厂类来创建即可,也就是说,不同类型的手机由不同类型的工厂类创建;原先的工厂类不负责创建手机,只是提供创建手机的规范(改为工厂类接口或抽象类),创建手机的动作下沉到具体的类型的工厂类

示例代码

1. 创建 IPhoneFactory.interface 手机基类

/**
 * 手机工厂基类
 */
public interface IPhoneFactory {
    IPhone createPhone();
}

2. 创建 XiaomiFactory.class 实现 IPhoneFactory 接口,提供实例化手机的具体方法

/**
 * 小米手机工厂类
 */
public class XiaomiFactory implements IPhoneFactory {
    @Override
    public IPhone createPhone() {
        return new XiaomiPhone();
    }
}

3. 创建 HuaweiFactory.class 实现 IPhoneFactory 接口,提供实例化手机的具体方法

/**
 * 华为手机工厂类
 */
public class HuaweiFactory implements IPhoneFactory {
    @Override
    public IPhone createPhone() {
        return new HuaweiPhone();
    }
}

4. 创建 Jingdond.class,提供订购不同类型手机的方法,Taobao.class 代码与之一样

/**
 * 京东商城
 */
public class Jingdond {
    /**
     * 订购小米手机
     */
    public void orderXiaomiPhone() {
        IPhoneFactory factory = new XiaomiFactory();
        IPhone phone = factory.createPhone();
        phone.play();
    }

    /**
     * 订购华为手机
     */
    public void orderHuaweiPhone() {
        IPhoneFactory factory = new HuaweiFactory();
        IPhone phone = factory.createPhone();
        phone.play();
    }
}

这样就通过工厂方法模式让用户订购不同类型的手机

工厂方法模式总结

工厂方法模式是定义一个工厂接口基类,基类中定义一个创建产品的抽象方法。每个产品需要有自己的工厂来实现这个基类,并完成创建对应产品实例的方法,由具体的产品调用该方法来创建对象;它主要适用于调用者已经明确知道需要创建哪一个具体产品的场景;比如,针对华为用户,已经明确知道要创建华为的手机产品;

工厂方法模式的优势在于完全符合了开闭原则,在新增产品时不需要再改动已存在的代码,使工厂类和产品类的代码完全解耦,更利于程序的扩展;

缺点也很明显,当新增产品时,需要同时新增产品类和工厂类,导致系统中的类是成对增加,增加了系统的复杂度;

抽象工厂模式

基于上面的工厂方法模式,如果现在用户除了订购手机,还需要订购电脑服务,那么我们是继续添加华为和小米的 PcFactory 吗?当然没有必要,因为不管用户买手机还是买电脑都只用华为一个工厂生产出来即可,所以我们可修改代码结构如下

示例代码

1. 创建 IPc.interface 电脑基类

/**
 * 电脑基类
 */
public interface IPc {
    void play();
}

2. 创建 XiaomiPc.class 实现 IPc 接口,HuaweiPc.class 代码与之类似

/**
 * 小米电脑
 */
public class XiaomiPc implements IPc {
    @Override
    public void play() {
        System.out.println("使用小米电脑玩游戏");
    }
}

3. 创建 IFactory.interface 基类,提供创建手机和电脑的方法

/**
 * 手机工厂基类
 */
public interface IFactory {
    // 创建手机
    public IPhone createPhone();
    // 创建电脑
    public IPc createPc();
}

4. 在 XiaomiFactory.class 和 HuaweiFactory.class 实现 IFactory 接口,实现具体创建逻辑

/**
 * 小米手机工厂类
 */
public class XiaomiFactory implements IFactory {
    /**
     * 制造小米手机
     */

    @Override
    public IPhone createPhone() {
        return new XiaomiPhone();
    }
    /**
     * 制造小米电脑
     */
 
    @Override
    public IPc createPc() {
        return new XiaomiPc();
    }
}

5. 在 Jingdond.class 和 Taobao.class 中提供不同品牌的订购方法

/**
 * 京东商城
 */
public class Jingdond {
    /**
     * 订购小米产品
     */
    public void orderXiaomi() {
        IFactory factory = new XiaomiFactory();
        IPhone phone = factory.createPhone();
        phone.play();

        IPc pc = factory.createPc();
        pc.play();
    }
    /**
     * 订购华为产品
     */
    public void orderHuawei() {
        IFactory factory = new HuaweiFactory();
        IPhone phone = factory.createPhone();
        phone.play();

        IPc pc = factory.createPc();
        pc.play();
    }
}

这样就通过抽象工厂模式实现了用户订购不同品牌手机和电脑的需求

抽象工厂模式总结

抽象工厂模式是将具有一定共性的产品封装到一块,由工厂类分别为这些产品提供创建对象的方法,调用者可以根据不同的需求调用工厂类的具体方法来获得产品实例;比如案例中华为的手机、ipad和电脑都属于华为公司产品,所以可以由华为工厂类来负责分别创建不同的对象

优点在于将具有一定共性的产品集合封装到一起,在实际开发中更符合具体的业务场景

缺点就是降低了系统的扩展性,当新增产品时需要修改工厂类,在工厂类的基类和实现类中都需要增加对应的方法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值