目录
四、工厂方法模式
1、概述
2、应用场景
3、优缺点
优点
缺点
4、主要角色
5、代码实现
功能类
测试类
运行结果
四、工厂方法模式
第二次梳理:“工厂方法模式”是对简单工厂模式的进一步抽象化,在简单工厂模式中,创建的多个不同的产品是交给一个工厂创建的,每增加一个产品都需要对工厂代码进行修改,违背了“开闭原则”,在这里我们将简单工厂进一步抽象,为每一个产品写一个具体的工厂,这些具体的工厂共同实现一个抽象工厂接口,并负责具体对象的创建过程。当需要创建对象的时候,直接new一个具体工厂类出来(也不一定是直接new出来的,可以将这个工厂的全限定类名写在配置文件中,通过Class.forName()
方法创建工厂对象,这样写可以在配置文件中修改具体工厂类),赋值给抽象工厂接口,然后调用创建对象的方法创建即可!工厂方法模式每次新增一个对象不需要修改原代码,只需要新增一个工厂即可!遵循了“开闭原则”!时间:2021年05月13日 10时30分23秒
补充:通过Class.forName()
方法创建工厂对象代码示例时间:2021年05月13日 10时39分14秒
// DogFactory dogFactory = new DogFactoryImpl(); // 原始写法 Class<?> forName = Class.forName("com.zibo.design.one.DogFactoryImpl"); DogFactory dogFactory = (DogFactory)forName.newInstance();
一个抽象工厂,多个具体工厂,每个工厂生产一种产品!时间:2021年05月13日 11时24分17秒
1、概述
简单讲:抽象工厂提供创建产品的接口,每一个具体工厂创建一种具体的产品,使用者根据具体工厂,得到具体产品;
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则;
满足开闭原则:当新增一个产品的时候只需要添加一个新的具体工厂,不需要修改原始代码;
2、应用场景
- 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等;
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口;
- 客户不关心创建产品的细节,只关心产品的品牌;
3、优缺点
优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类;
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则;
缺点
- 类的个数容易过多,增加复杂度;
- 增加了系统的抽象性和理解难度;
- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决;
4、主要角色
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品;
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建;
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能;
- 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应;
5、代码实现
功能类
package com.zibo.design.one;
// 抽象产品
public interface Dog{
void sleep();
}
// 抽象工厂
interface DogFactory{
Dog create();
}
// 具体工厂1
class BigDogFactory implements DogFactory{
public Dog create(){
return new BigDog();
}
}
// 具体工厂2
class LittleDogFactory implements DogFactory{
public Dog create(){
return new LittleDog();
}
}
// 具体产品1
class BigDog implements Dog {
@Override
public void sleep() {
System.out.println("大狗在睡觉!");
}
}
// 具体产品2
class LittleDog implements Dog {
@Override
public void sleep() {
System.out.println("小狗在睡觉!");
}
}
测试类
package com.zibo.design.one;
public class Test {
public static void main(String[] args) {
BigDogFactory bigDogFactory = new BigDogFactory();
bigDogFactory.create().sleep();
LittleDogFactory littleDogFactory = new LittleDogFactory();
littleDogFactory.create().sleep();
}
}
运行结果
大狗在睡觉!
小狗在睡觉!