设计模式之工厂模式与抽象工厂模式(一)

176 阅读3分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」。

Hello大家晚上好,我是阿Q,好久不见,甚为想念(窃喜)。最近一段时间一直在参与安卓项目的开发(已忙成狗),也没能抽出时间来继续为大家总结设计模式的知识,在这里Say sorry了。由于好久没有写安卓方面的东西了,所以最近一段时间写起代码来事倍功半,踩了N多坑,被虐成Dog了。

我最近有一个想法,就是想将之前学过的安卓知识再拾起来,以后在讲解java知识的同时也穿插着总结一下安卓的知识,也不知道大家感不感兴趣。如果大家想学习安卓或者有什么技术交流的可以在后台给阿Q留言,阿Q视情况不定期更新安卓。好了,今晚回来的比较早,就抽时间讲一下工厂模式与抽象工厂设计模式吧。

简单工厂模式

首先呢,我们先来了解一下简单工厂模式。其实简单工厂模式并不是一个真正的设计模式,而是一种编程习惯。既然是一种习惯,就说明它有可取之处。所谓简单工厂模式,就是定义一个工厂类,将实例化对象的操作放在该工厂中去执行,当客户端调用的时候只需要将参数传入工厂就可得到该实体类。

接下来阿Q就用一个小Demo来给大家做更详细的讲解。

一、定义一个抽象的接口

//定义课程接口
public interface Course {
	void desc();
}

二、声明实体类来实现该接口

//语文课类
public class Chinese implements Course{

	@Override
	public void desc() {
		System.out.println("这是语文课");
	}

}

//数学课类
public class Math implements Course{

	@Override
	public void desc() {
		System.out.println("这是数学课");
	}

}

//英语课类
public class English implements Course{

	@Override
	public void desc() {
		System.out.println("这是英语课");
	}

}

三、定义一个工厂类来管理上边声明的实体类

//定义工厂类
public class MyFactory {
	
	public static Course selectCourse(String type) {
		
		Course course = null;
		
		switch (type) {
			case "chinese":
				course = new Chinese();
				break;
	
			case "math":
				course = new Math();
				break;
				
			case "english":
				course = new English();
				break;
		}
		return course;
	}
}

这样我们只需要传入类型就能获取相应的类对象了。

四、客户端调用

public class TestDemo {
	
	public static void main(String[] args) {
		
		Course course1 = MyFactory.selectCourse("chinese");
		Course course2 = MyFactory.selectCourse("math");
		Course course3 = MyFactory.selectCourse("english");
		course1.desc();
		course2.desc();
		course3.desc();
	}

}

执行结果

在这里插入图片描述

简单工厂设计模式的优点: 对于客户端来说,去除了具体的类的依赖;无需提供具体的类名,只需要调用工厂类传入相应的参数就可以得到相应的实体类;

简单工厂设计模式的缺点: 就是每需要增加一个实体类,就需要去修改工厂类中的方法,可扩展性差;不同的产品需要不同额外参数的时候不支持;耦合性高,违反了开—闭原则。

了解了简单工厂设计模式,下文我们来切入正题,讲讲工厂模式是怎样实现的。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!