1、描述
工厂方法模式是对简单工厂模式的抽象提取。有一个抽象的 Factory 类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
2、适用性
相对于简单工厂模式,工厂方法模式在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
3、实现逻辑
- 抽象产品类 :工厂类所创建的所有对象的超类,它负责描述所有实例所共有的公共接口。定义产品的规范,描述了产品的主要特性和功能。
- 具体产品类 :实现或者继承抽象产品的子类;是工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。在工厂方法模式中某具体产品有专门的具体工厂创建,它们之间往往一一对应。
- 抽象工厂类:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。制定具体工厂类的规范。
- 具体工厂类:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
4、实战代码
通过从饮品店生成茶和咖啡为例;
/**
* 抽象产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:24:11
*/
public abstract class Drinks {
}
/**
* 具体产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:26:36
*/
public class Coffee extends Drinks {
public Coffee() {
System.out.println("Coffee");
}
}
/**
* 具体产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:29:14
*/
public class Tea extends Drinks {
public Tea() {
System.out.println("Tea");
}
}
/**
* 抽象工厂类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 08:03:13
*/
public interface DrinksFactory {
Drinks createDrinks();
}
/**
* 具体工厂类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:19:53
*/
public class CoffeeFactory implements DrinksFactory {
@Override
public Coffee createDrinks() {
return new Coffee();
}
}
/**
* 具体工厂类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:19:53
*/
public class TeaFactory implements DrinksFactory {
@Override
public Tea createDrinks() {
return new Tea();
}
}
/**
* 测试类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:41:14
*/
public class Client {
public static void main(String[] args) {
DrinksFactory drinksFactory = new CoffeeFactory();
TeaFactory teaFactory = new TeaFactory();
drinksFactory.createDrinks();
teaFactory.createDrinks();
}
}
客户端执行结果:
从以上的编写的代码可以看到,要增加产品类时相应的增加工厂类,不需要修改工厂类的代码了,这样就解决了简单工厂模式新增产品时需要修改工厂类的缺点。
工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
标签:实战,11,23,模式,工厂,具体,抽象,设计模式,public From: https://www.cnblogs.com/eajur/p/16861882.html