工厂模式总结

需求:比如现在有个手机工厂,需要生产出不同类型的手机产品【小米手机】【华为手机】

包含手机类(Phone)、两个子类 小米手机(XiaoMiPhone)和华为手机(HuaWeiPhone)

传统模式

类图如下:

优点:比较简单、好理解。

缺点:违反了开闭原则(即对扩展开放,对修改关闭),如果某天我们需要新增一个【魅族手机】那么工程中所有涉及orderPhone的地方都需要修改。

改进思路:把创建手机对象的代码封装到一个类中,如果要新增手机产品,只需要修改这个类即可

简单工厂模式

是由一个工厂对象决定创建哪种产品类的实例,包含如下角色

抽象产品:定义产品规范,描述了产品的主要特性和功能

具体产品:实现/继承抽象产品的子类

具体工厂:提供了创建产品的方法,调用者通过调用此方法来获取产品

/**
 * 手机简单工厂类
 */
public class PhoneFactory {

    public Phone createPhone(String type){
        Phone phone = null;
        if ("xiaomi".equals(type)){
            phone = new XiaoMiPhone();
        } else if ("huawei".equals(type)){
            phone = new HuaWeiPhone();
        }
        return phone;
    }
}

 通过简单工厂模式类图可知,以后再新增新的手机产品,只需要更改PhoneFactory即可。

 但是修改PhoneFactory工厂类,又违反了开闭原则。

工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象,工厂方法模式使一个产品类的实例化延迟到其工厂的子类。

主要角色:

抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品;

具体工厂:实现抽象工厂中的抽象方法,完成具体产品的创建;

抽象产品:定义产品规范,描述了产品的主要特性和功能

具体产品:实现/继承抽象产品的子类,由具体工厂创建,与具体工厂一一对应

 

/**
 * 手机工厂,定义创建手机的抽象方法
 */
public interface PhoneFactory {
    Phone createPhone();
}


/**
 * 具体的工厂,完成具体产品的创建
 * 小米手机工厂,创建小米手机
 */
public class XiaoMiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new XiaoMiPhone();
    }
}

/**
 * 具体工厂,完成具体产品的创建
 * 华为手机工厂,创建华为手机
 */
public class HuaWeiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }
}

 优点:需要新增新的产品时,只需要新增具体的产品类和具体的产品工厂类,无须对原工厂进行改造,符合“开闭原则”;

缺点:每增加一个产品就需要新增一个具体产品类和具体的产品工厂类,增加了系统的复杂度。

如新增一个【魅族手机】,就需要新增一个魅族手机产品类和具体的魅族手机工厂类。

抽象工厂模式

主要角色:

抽象工厂:提供创建产品的接口,包含多个创建产品的方法,可以创建多个不同级别的产品

具体工厂:实现抽象工厂的方法,完成具体产品的创建

抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品

具体产品 :实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系

产品等级的概念:如小米手机和华为手机都属于手机就构成了一个产品等级结构,小米电脑和华为电脑都属于电脑就构成了另一个产品等级结构。

产品族:而小米手机和小米电脑都属于小米公司,就构成了一个产品族,同理华为手机和华为电脑也构成了一个产品族。

/**
 * 抽象工厂的工厂接口
 */
public interface AbstractFactory {
    public Phone createPhone();
    public Computer createComputer();
}

/**
 * 小米工厂,负责生产小米产品
 */
public class XiaoMiFactory implements AbstractFactory{
    @Override
    public Phone createPhone() {
        return new XiaoMiPhone();
    }

    @Override
    public Computer createComputer() {
        return new XiaoMiComputer();
    }
}

/**
 * 华为工厂,负责生产华为产品
 */
public class HuaWeiFactory implements AbstractFactory{
    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }

    @Override
    public Computer createComputer() {
        return new HuaWeiComputer();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值