在说工厂方法模式之前, 先了解一下简单工厂模式. 工厂方法模式其实是在简单工厂上面做了一些增强.
简单工厂模式: 有一个专门的类来生产其他类的实例, 生产的这些实例有一个共同父类. 这个跟我们的多态有一点像.
例子:
假如我们有一个鼠标工厂, 这个工厂既可以生产联想鼠标, 又可以生产宏碁鼠标.
代码如下:
1, 鼠标工厂(可以生产联想鼠标和宏碁鼠标)
- public class MouseFactory {
- /**
- * 生产一个鼠标
- * @param i
- * @return
- */
- public Mouse createMouse(int i){
- Mouse mouse = null;
- switch (i){
- case 1:
- mouse = new LenovoMouse();
- break;
- case 2:
- mouse = new AcerMouse();
- break;
- }
- return mouse;
- }
- }
2, 鼠标接口 (有一个 getName() 的方法)
- public interface Mouse {
- void getName();
- }
3, 联想鼠标实现类(实现鼠标接口, 可以生产联想鼠标)
- public class LenovoMouse implements Mouse {
- @Override
- public void getName() {
- System.out.println("这个是联想鼠标");
- }
- }
4, 宏碁鼠标实现类(实现鼠标接口, 可以生产宏碁鼠标)
- public class AcerMouse implements Mouse {
- @Override
- public void getName() {
- System.out.println("这个是宏碁鼠标");
- }
- }
5, 客户端(需要鼠标的人, 可以买联想鼠标也可以买宏碁鼠标)
- @SpringBootTest
- class FactoryApplicationTests {
- @Test
- void contextLoads() {
- MouseFactory factory = new MouseFactory();
- Mouse mouse = factory.createMouse(2);
- mouse.getName();
- }
这样简单工厂就算实现了, 可以传入 1 和 2 让工厂分别生成联想鼠标和宏碁鼠标.
接下来我们在简单工厂的基础上看看工厂方法模式.
工厂方法模式: 定义一个专门生产其他类实例的接口, 让子类决定具体生产哪个类的实例.
例子:
有一个鼠标工厂开了两个子公司, 一个是联想鼠标工厂用来专门生产联想鼠标, 另一个是宏碁鼠标工厂用来专门生产宏碁鼠标.
代码如下:
1, 鼠标工厂接口:
- public interface MouseFactory {
- Mouse createMouse();
- }
2, 联想鼠标工厂(用来生产联想鼠标)
- public class LenovoMouseFactory implements MouseFactory {
- @Override
- public Mouse createMouse() {
- return new LenovoMouse();
- }
- }
3, 宏碁鼠标工厂(用来生产宏碁鼠标)
- public class AcerMouseFactory implements MouseFactory {
- @Override
- public Mouse createMouse() {
- return new AcerMouse();
- }
- }
鼠标类跟简单工厂一样, 复制如下:
4, 鼠标接口 (有一个 getName() 的方法)
- public interface Mouse {
- void getName();
- }
5, 联想鼠标实现类(实现鼠标接口, 可以生产联想鼠标)
- public class LenovoMouse implements Mouse {
- @Override
- public void getName() {
- System.out.println("这个是联想鼠标");
- }
- }
6, 宏碁鼠标实现类(实现鼠标接口, 可以生产宏碁鼠标)
- public class AcerMouse implements Mouse {
- @Override
- public void getName() {
- System.out.println("这个是宏碁鼠标");
- }
- }
7, 客户端(需要鼠标的人, 可以买联想鼠标也可以买宏碁鼠标)
- @SpringBootTest
- class FactoryApplicationTests {
- @Test
- void demo(){
- LenovoMouseFactory lenovoMouseFactory = new LenovoMouseFactory();
- Mouse lenovoMouse = lenovoMouseFactory.createMouse();
- lenovoMouse.getName();
- AcerMouseFactory acerMouseFactory = new AcerMouseFactory();
- Mouse acerMouse = acerMouseFactory.createMouse();
- acerMouse.getName();
- }
- }
我们可以通过不同的工厂来获取不同实例, 假如我们想买一个联想鼠标, 则去联想工厂买. 想买宏碁鼠标, 则去宏碁工厂买.
这样, 我们就实现了工厂方法模式, 假如我们想要一个华硕鼠标, 则建一个华硕工厂去生产华硕鼠标即可.
如果文章对您有帮助, 请记得点赞关注哟~
欢迎大家关注我的公众号<情系 IT>, 每日技术推送文章供大家学习参考.
来源: https://www.cnblogs.com/zhixie/p/11696327.html