原文来自:www.toutiao.com/i6760107693…
一、工厂方法模式的定义
工厂方法模式是定义一个创建实例的接口,真实创建实例由子工厂类去做。工厂方法摸式是对简单工厂模式的扩展与改进,弥补了简单工厂模式扩展不足的问题。
工厂方式模式与简单工厂模式一样,只能创建同一类型的产品,因为工厂实现类遵循同一的接口。
二、工厂方法模式的有点
1. 什么产品用什么工厂创建,非常明确,只需要知道是要创建什么样的产品,也就明白了需要用什么工厂去创建,通过名称约定去实现,遵循同一的规则
2. 系统增加新的产品,只需要增加具体的产品类与具体的子工厂,而无需对原工厂修改,这解决了简单工厂中违背“开闭原则“的问题
三、工厂方法模式的缺点
每增加一种产品,必须得增加这类型的工厂,增加了系统的复杂度,如果产品很多,会有很多的工厂,很多的类,管理维护差。
四、工厂方法模式示例
1. 结构示例图
① 定义抽象工厂;提供所有子工厂的同一定义接口,对象提供一个创建的方法
② 具体工厂;对每个产品的生产的具体工厂,继承抽象工厂
③ 抽象产品;同一的产品类定义
④ 具体的产品
工厂方法模式结构
说明:图片来自c.biancheng.net/
2. 工厂方法模式示例
① 抽象工厂的定义
3. public interface
AbstractFactory {
/**
* 创建对象
* @return
*/
Employee create();
}
②具体工厂的定义
public class PragrammerFactory implements AbstractFactory {
@Override
public Employee create() {
return new Programmer();
}
}
public class SalerFactory implements AbstractFactory {
@Override
public Employee create() {
return new Saler();
}
}
③抽象产品的定义
public abstract class Employee {
private int id;
private String name;
public abstract void action();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
④具体产品的实现
public class Programmer extends Employee {
@Override
public void action() {
System.out.println(getName() + "苦逼的程序员正在写bug~");
}
}
public class Saler extends Employee {
@Override
public void action() {
System.out.println(getName() + "我正在与客户沟通~~");
}
}
工厂方法模式到这儿就完成了,是不是很简单,怎么用的话,有各种变形,我在这个举一个例子,看看
public class Factory implements AbstractFactory {
private AbstractFactory factory;
public Factory(AbstractFactory factory){
this.factory = factory;
}
@Override
public Employee create() {
System.out.println("这是一个装饰模式的factory,可用性更强");
return factory.create();
}
}
以统一工厂去创建,具体工厂作为参数,这利用装饰模式去实现,我觉得这样用还不错。