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

144 阅读2分钟

「这是我参与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可以加入技术交流群参与讨论呦!