设计模式之——工厂方法模式
2019-03-01 本文已影响0人
Jerry_1116
1 定义
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式通用类图
2 通用代码示例
2.1 产品类
抽象产品类代码:
public abstract class Product {
/**
* 产品的共享方法,对所有的继承子类方法生效
*/
public void sharedMethod() {
}
/**
* 产品的抽象方法,需要各个具体实现类进行实现
*/
public abstract void method();
}
具体实现类:
具体实现类可以有多个,都继承自抽象产品类。
public class ConcreteProductA extends Product {
@Override
public void method() {
//业务处理逻辑
}
}
public class ConcreteProductB extends Product {
@Override
public void method() {
//业务处理逻辑
}
}
2.2 工厂类
抽象工厂类负责定义产品对象的产生方法。
抽象工厂类:
public abstract class CreatorFactory {
/**
* 声明生成产品的方法
*
* @return 产品实例
*/
public abstract Product createProduct();
}
产生ConcreteProductA的工厂类ConcreteCreatorFactoryA类:
public class ConcreteCreatorFactoryA extends CreatorFactory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
产生ConcreteProductB的工厂类ConcreteCreatorFactoryB类:
public class ConcreteCreatorFactoryB extends CreatorFactory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
2.3 客户端类
public class Client {
public static void main(String[] args) {
CreatorFactory factory;
Product product;
factory = new ConcreteCreatorFactoryA();
product = factory.createProduct();
factory = new ConcreteCreatorFactoryB();
product = factory.createProduct();
}
}
3 工厂方法模式的使用场景
在以下几种场景中,可以考虑使用工厂方法模式:
- 工厂方法模式是new一个对象的替代方式。
- 需要灵活、扩展性强的框架时。
- 软件需要用在异构项目中,减少与外围系统的耦合。
- 适用于测试驱动开发的框架下。
总之一句话,工厂方法比较适合横向扩展需求较多的场景。
4 工厂方法模式的优缺点
-
优点
工厂方法模式中我们把生成产品类的时间延迟,就是通过对应的工厂类来生成对应的产品类,在这里我们就可以实现“开发-封闭”原则,无论加多少产品类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现。- 良好的封装性,代码结构清晰。
创建一个具体的产品对象,只需要知道对应的工厂类就可以了,而不需要知道具体的创建方法。 - 工厂方法模式扩展性非常优秀,符合“开-闭原则”
在增加产品类的情况下,只要适当地修改具体实现类或者扩展一个工厂类,就可以实现。 - 屏蔽产品类
只要保持抽象类和接口类不变,无论产品如何变化,都不会影响现有实现。
- 良好的封装性,代码结构清晰。
-
缺点
如果产品类过多,我们就要生成很多的工厂类。假如我们要实现的产品接口不止一个,也就是有多个产品接口,不同产品接口有对应的产品族。什么是产品族呢?简单的理解就是,不同牌子产的车里面会有跑车类型,家庭类型,商用类型等的车,不同牌子的车的跑车类型的车可以组成一个产品族。对于这种情况我们可以采用抽象工厂模式。