工厂方法模式

107 阅读2分钟

原文来自: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();
    }
}

以统一工厂去创建,具体工厂作为参数,这利用装饰模式去实现,我觉得这样用还不错。