设计模式(4)---抽象工厂模式

在这里插入图片描述

上一篇:工厂模式

1.什么是抽象工厂模式?

  在上一篇文章中我们也说到,抽象工厂模式可以说是一个超级工厂,可以通过超级工厂来创建其他的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,无需指定他们具体的类,每个生成的工厂都可以按照工厂模式来创建对象。

1.什么时候使用抽象工厂模式?

  系统的产品有多个产品族,而我们只需要消费其中某一个产品族中的产品。什么是产品族?

以手机为例:

在这里插入图片描述

3.如何实现抽象工厂模式?

1)定义手机接口
/**
 * 定义 手机 接口
 */
public interface Phone {
	
	//定义手机功能
	/**
	 * 开机
	 */
	void boot();
	/**
	 * 关机
	 */
	void shutdown();
	/**
	 * 发短信
	 */
	void sendMessage();
	
}

2)定义路由器接口
/**
 * 定义 路由器 接口
 */
public interface Router {

	//定义路由器功能

	/**
	 * 开机
	 */
	void boot();
	/**
	 * 关机
	 */
	void shutdown();
	/**
	 * 打开wifi
	 */
	void openwifi();
}
3)定义小米手机类

此类是小米手机的具体实现

/**
 * 定义小米手机类
 */
public class XiaomiPhone implements Phone {

	@Override
	public void boot() {
		System.out.println("开启小米手机");
	}

	@Override
	public void shutdown() {
		System.out.println("小米手机关机");
	}

	@Override
	public void sendMessage() {
		System.out.println("小米手机发送短信");
	}
}

4)定义小米路由器

此类是小米路由器具体实现类。

/**
 * 定义小米路由器类
 */
public class XiaomiRouter implements Router {

	@Override
	public void boot() {
		System.out.println("开启小米路由器");
	}

	@Override
	public void shutdown() {
		System.out.println("关闭小米路由器");
	}

	@Override
	public void openwifi() {
		System.out.println("小米路由器打开wifi");
	}
}

5)定义华为手机类

此类是华为手机的具体实现类

/**
 * 定义华为手机类
 */
public class HuaweiPhone implements Phone {

	@Override
	public void boot() {
		System.out.println("开启华为手机");
	}

	@Override
	public void shutdown() {
		System.out.println("华为手机关机");
	}

	@Override
	public void sendMessage() {
		System.out.println("华为手机发送短信");
	}
}
6)定义华为路由器类

此类是华为路由器的具体实现类

/**
 * 定义华为路由器类
 */
public class HuaweiRouter implements Router {

	@Override
	public void boot() {
		System.out.println("开启华为路由器");
	}

	@Override
	public void shutdown() {
		System.out.println("关闭华为路由器");
	}

	@Override
	public void openwifi() {
		System.out.println("华为路由器打开wifi");
	}
}
7)定义抽象工厂类
/**
 * 定义 抽象 工厂类
 */
public interface AbstractFactory {

	/**
	 * 生产手机
	 */
	Phone productPhone();

	/**
	 * 生产路由器
	 */
	Router productRouter();

}
8)定义小米工厂
/**
 * 定义小米工厂
 */
public class XiaomiFactory implements AbstractFactory {

	@Override
	public Phone productPhone() {
		return new XiaomiPhone();
	}

	@Override
	public Router productRouter() {
		return new XiaomiRouter();
	}
}
9)定义华为工厂
/**
 * 定义华为工厂
 */
public class HuaweiFactory implements AbstractFactory {

	@Override
	public Phone productPhone() {
		return new HuaweiPhone();
	}

	@Override
	public Router productRouter() {
		return new HuaweiRouter();
	}
}

10)编写测试类
/**
 * 测试类
 */
public class Test {

	public static void main(String[] args) {
		//创建一个小米工厂
		XiaomiFactory xiaomiFactory = new XiaomiFactory();
		//小米工厂生产小米手机,获取小米手机对象
		Phone phone = xiaomiFactory.productPhone();
		//使用小米手机功能
		phone.boot();
		phone.sendMessage();
		phone.shutdown();

		/**
		 * 华为操作如上……
		 */

	}
}
11)运行结果

在这里插入图片描述

4.抽象工厂模式优缺点?

1)优点:

1.当一个产品族(小米、华为)被设计成一起工作时,此模式能够保证始终只使用其一种产品。
2.在使用的时候我们不需要去关心它实现的细节,直接找工厂拿就行。

2)缺点:

1.在工厂中就已经规定了生产哪些产品,扩展生产种类麻烦(如小米生产家电,那就需要修改工厂代码)
2.工厂模式本来挺easy的,但是这种模式更加抽象更加不容易搞懂。

下一篇:建造者模式

发布了79 篇原创文章 · 获赞 42 · 访问量 7895

猜你喜欢

转载自blog.csdn.net/qq_43655835/article/details/104003675