工厂方法(FactoryMethod)模式是一种对象创建型模式
1.工厂方法模式的定义与特点
工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。
我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。
如果要创建的产品不多,只需要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它的缺点是新增产品时需要修改工厂方法,违背“开闭原则”
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
工厂方法模式的主要优点有:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
其缺点是:每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
2.工厂方法模式的结构与实现
1.模式的结构
工厂方法模式的主要角色:
- 抽象工厂(AbstractFactory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品
- 具体工厂(Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建
- 抽象产品(AbstractProduct):定义了产品的规范,描述了产品的主要特性和功能
- 具体产品(Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
2.结构图
3.模式的实现
分析:使用工厂模式,实现不同手机的生产
代码示例:
public class FactoryMethodTest {
public static void main(String[] args) {
//简单工厂模式
System.out.println("简单工厂模式:");
MobileSimpleFactory simpleFactory = new MobileSimpleFactory();
IMobile huaWeiMobile = simpleFactory.createMobile("HuaWei");
huaWeiMobile.show();
IMobile appleMobile = simpleFactory.createMobile("Apple");
appleMobile.show();
//工厂方法模式
System.out.println("\n工厂方法模式:");
IFactory huaWeiFactory = new HuaWeiFactory();
IMobile huaWeiMobile2 = huaWeiFactory.createMobile();
huaWeiMobile2.show();
IFactory appleFactory = new AppleFactory();
IMobile appleMobile2 = appleFactory.createMobile();
appleMobile2.show();
}
}
运行结果:
简单工厂模式:
手机工厂 --> 生产了一部华为手机
品牌:HuaWei
手机工厂 --> 生产了一部苹果手机
品牌:Apple
工厂方法模式:
华为手机工厂 --> 生产了一部华为手机
品牌:HuaWei
苹果手机工厂 --> 生产了一部苹果手机
品牌:Apple
手机相关实现类:
public interface IMobile {
/**
* 手机信息
*/
void show();
}
/**
* 华为手机
*/
public class HuaWeiMobile implements IMobile {
@Override
public void show() {
System.out.println("品牌:HuaWei");
}
}
/**
* 苹果手机
*
*/
public class AppleMobile implements IMobile {
@Override
public void show() {
System.out.println("品牌:Apple");
}
}
简单工厂实现类:
/**
* 手机工厂
*/
public class MobileSimpleFactory {
/**
* 生成手机
*
* @param model 型号
* @return
*/
public IMobile createMobile(String model) {
if (model.equalsIgnoreCase("HuaWei")) {
System.out.println("手机工厂 --> 生产了一部华为手机");
return new HuaWeiMobile();
} else if (model.equalsIgnoreCase("Apple")) {
System.out.println("手机工厂 --> 生产了一部苹果手机");
return new AppleMobile();
} else if (model.equalsIgnoreCase("Oppo")) {
System.out.println("手机工厂 --> 生产了一部Oppo手机");
return new OppoMobile();
}
return null;
}
}
工厂方法模式实现类:
/**
* 抽象手机工厂,提供手机的生产方法
*/
public interface IFactory {
IMobile createMobile();
}
/**
* 华为手机工厂
*/
public class HuaWeiFactory implements IFactory {
@Override
public IMobile createMobile() {
System.out.println("华为手机工厂 --> 生产了一部华为手机");
return new HuaWeiMobile();
}
}
/**
* 苹果手机工厂
*/
public class AppleFactory implements IFactory {
@Override
public IMobile createMobile() {
System.out.println("苹果手机工厂 --> 生产了一部苹果手机");
return new AppleMobile();
}
}