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

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

上文中我们用实例讲解了工厂模式的使用以及优缺点,今天我们再来看看抽象工厂模式的使用与优缺点!

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。接下来同样举例说明。

一、定义实体类

//汽车座椅
public class Sofa {
    //颜色
	private String color;
    //舒适度
	private String soft;
	
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getSoft() {
		return soft;
	}
	public void setSoft(String soft) {
		this.soft = soft;
	}
}

//汽车车轮
public class Wheel {
	//半径
	private String radiu;
    //大小
	private String size;
    
	public String getRadiu() {
		return radiu;
	}
	public void setRadiu(String radiu) {
		this.radiu = radiu;
	}
	public String getSize() {
		return size;
	}
	public void setSize(String size) {
		this.size = size;
	}

}
复制代码

二、定义两个接口

//汽车座椅
public interface ISofa {
	//改变座椅颜色
	void changeColor();
	//改变座椅舒适度
	void changeSoft();
}

//汽车车轮
public interface IWheel {
	//改变大小
	void changeSize();
	//改变半径
	void changeRadius();
}
复制代码

三、定义不同的实体类分别实现两接口

//本田汽车的座椅
public class BenSofa implements ISofa {

	@Override
	public void changeColor() {
		System.out.println("本田车变为蓝色了");
	}

	@Override
	public void changeSoft() {
		System.out.println("本田车变舒服了");
	}

}

//丰田汽车的座椅
public class FengSofa implements ISofa{

	@Override
	public void changeColor() {
		System.out.println("丰田车变为红色了");
	}

	@Override
	public void changeSoft() {
		System.out.println("丰田车变不舒服了");
	}

}

//本田汽车的车轮
public class BenWheel implements IWheel{

	@Override
	public void changeSize() {
		System.out.println("本田车轮子变大了");
	}

	@Override
	public void changeRadius() {
		System.out.println("本田车轮子半径变大了");
	}

}

//丰田汽车的车轮
public class FengWheel implements IWheel{
	
	@Override
	public void changeSize() {
		System.out.println("丰田车轮子变小了");
	}

	@Override
	public void changeRadius() {
		System.out.println("丰田车轮子半径变小了");
	}

}
复制代码

四、定义抽象工厂类

//汽车工厂类
public interface CarFactory {
    //获取座椅对象
	ISofa getSofa();
    //获取车轮对象
	IWheel getWheel();
}
复制代码

五、定义工厂实现类

//本田汽车
public class BenCarFactory implements CarFactory{

	@Override
	public ISofa getSofa() {
		return new BenSofa();
	}

	@Override
	public IWheel getWheel() {
		return new BenWheel();
	}
}

//丰田汽车
public class FengCarFactory implements CarFactory{

	@Override
	public ISofa getSofa() {
		return new FengSofa();
	}

	@Override
	public IWheel getWheel() {
		return new FengWheel();
	}

}
复制代码

六、客户端调用

public class DemoTest {
	
	public static void main(String[] args) {
		CarFactory benCar = new BenCarFactory();
		ISofa sofa = benCar.getSofa();
		sofa.changeColor();
		sofa.changeSoft();
	}

}
复制代码

执行结果:

在这里插入图片描述

抽象工厂模式优点: 抽象工厂模式最大的好处是易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。不管是任何人的设计都无法去完全防止需求的更改,或者项目的维护,那么我们的理想便是让改动变得最小、最容易。抽象工厂模式的另一个好处就是它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品实现类的具体类名也被具体的工厂实现类分离,不会出现在客户端代码中。

抽象工厂模式缺点: 客户端程序肯定不止一个,每次都需要声明,如果有100个调用CarFactory的类,就需要更改100次CarFactory benCar = new BenCarFactory();太繁琐。

好了今天就先说到这了,还是那句话,看懂了不是真懂了,还是有必要用手敲一下代码的!如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!