工厂方法模式
1、定义
定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行,简单来说就是父类工厂负责创建产品对象,子类负责生产具体产品对象。
2、工厂方法模式的结构
- Fruit:抽象的产品类
- AppleFruit、OrangeFruit:具体的产品类
- FruitFactory:抽象的父类产品工厂
- AppleFruitFactory、OrangeFruitFactory:具体的子类产品工厂
3、代码实现
Fruit :
/**
* @author: Renaaa
* @date: 2021-02-18 23:03
* @description: 工厂方法模式--抽象水果类
*/
public abstract class Fruit {
public abstract void buy();
}
AppleFruit:
/**
* @author: Renaaa
* @date: 2021-02-18 23:04
* @description: 工厂方法模式--具体的水果类型:橘子类型
*/
public class AppleFruit extends Fruit{
@Override
public void buy() {
System.out.println("买了一些苹果");
}
}
OrangeFruit:
/**
* @author: Renaaa
* @date: 2021-02-18 23:08
* @description: 工厂方法模式--具体的水果类型:橘子类型
*/
public class OrangeFruit extends Fruit {
@Override
public void buy() {
System.out.println("买了一些橘子");
}
}
FruitFactory:
/**
* @author: Renaaa
* @date: 2021-02-18 23:05
* @description: 工厂方法模式--抽象的父类水果工厂
*/
public abstract class FruitFactory {
public abstract Fruit buyFruit();
}
AppleFruitFactory:
/**
* @author: Renaaa
* @date: 2021-02-18 23:09
* @description: 工厂方法模式--具体的子类水果工厂
*/
public class AppleFruitFactory extends FruitFactory {
@Override
public Fruit buyFruit() {
return new AppleFruit();
}
}
OrangeFruitFactory:
/**
* @author: Renaaa
* @date: 2021-02-18 23:10
* @description: 工厂方法模式--具体的子类水果工厂
*/
public class OrangeFruitFactory extends FruitFactory {
@Override
public Fruit buyFruit() {
return new OrangeFruit();
}
}
Client:
/**
* @author: Renaaa
* @date: 2021-02-18 23:14
* @description: 客户端
*/
public class Client {
public static void main(String[] args) {
//苹果
AppleFruitFactory appleFruitFactory = new AppleFruitFactory();
Fruit fruit = appleFruitFactory.buyFruit();
fruit.buy();
//橘子
OrangeFruitFactory orangeFruitFactory = new OrangeFruitFactory();
orangeFruitFactory.buyFruit().buy();
}
}
运行效果:
4、工厂方法模式的优缺点和应用场景
优点:
- 用户只需要关心所需产品对应的工厂,无须关心创建细节
- 加入新产品符合开闭原则,提高可扩展性
缺点:
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
使用场景:
- 创建对象需要大量重复代码
- 客户端(应用层)不依赖产品类实例如何被创建、实现等细节
- 一个类通过其子类来指定创建哪个对象