需求:比如现在有个手机工厂,需要生产出不同类型的手机产品【小米手机】【华为手机】
包含手机类(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();
}
}