「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。
上文中我们讲解了“简单工厂模式”的使用以及优缺点,今天我们就来聊聊工厂模式是怎么实现的!
工厂模式(Factory Pattern)
工厂模式是简单工厂的仅一步深化,在工厂模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂,也就是说每个对象都有一个与之对应的工厂。这样说有点抽象,那我们就用“实力”说话。
一、定义一个抽象接口
//课程接口
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 interface BaseFactory {
Course getCourse();
}
四、定义各个实体类对应的工厂类
//语文课工厂类
public class ChineseFactory implements BaseFactory{
@Override
public Course getCourse() {
return new Chinese();
}
}
//数学课工厂类
public class MathFactory implements BaseFactory{
@Override
public Course getCourse() {
return new Math();
}
}
五、客户端调用
public class TestDemo {
public static void main(String[] args) {
try {
//使用反射机制实例化工厂对象,因为字符串是可以通过变量改变的
BaseFactory chineseFactory = (BaseFactory)Class.forName("com.itcast.ChineseFactory").newInstance();
BaseFactory mathFactory=(BaseFactory)Class.forName("com.itcast.MathFactory").newInstance();
//也可以用
//BaseFactory chineseFactory = new ChineseFactory();
//BaseFactory mathFactory = new MathFactory();
Course chineseCourse = chineseFactory.getCourse();
Course mathCourse = mathFactory.getCourse();
chineseCourse.desc();
mathCourse.desc();
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:
工厂模式的优点: 工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行,克服了简单工厂模式违背的开—闭原则;保持了封装对象创建过程的优点;扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;屏蔽产品的具体实现,调用者只关心产品的接口。
工厂模式的缺点: 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
看到这你应该对工厂模式有了相应的了解了吧,接下来我们继续深入,来看看抽象工厂模式是怎样实现的。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!