23设计模式(三)抽象工厂
简要总结23种设计模式的抽象工厂
三、抽象工厂模式
?上面介绍的工厂方法模型考虑的是一类产品的生产,比如生产汽车的汽车厂商和生产手机的手机厂商。但是,在日常生活中,手机厂商不一定只生产手机。比如华为也生产路由器和电脑。显然,工厂模式解决不了这种问题。
?这里可以介绍产品族和产品等级的概念。如下图所示,海尔和TCL都可以同时生产电视机和空调。这里同一个厂家生产的系列是一个产品系列,同一个产品就是产品档次。工厂模式只能解决产品等级上的问题,而产品族则是由抽象工厂模式来解决。
3.1 抽象工厂模式的特点
除了工厂模型的特点,抽象工厂还具有:
与产品系列相关联的多级产品可以在一个类中联合管理,而无需引入几个新的类来管理。
当需要一个产品族时,抽象工厂可以保证客户端始终只使用同一产品的产品组。
抽象工厂增强了程序的可扩展性,在添加新的产品系列时,不需要修改原始代码来满足开放封闭原则。
缺点:
当一个新产品需要添加到产品系列中时,所有的工厂类都需要修改。增加了系统的抽象性和理解难度。
3.2 抽象工厂模式的实现
抽象工厂的主要角色如下。
摘要工厂:提供了一个创建产品的界面,包括几种创建产品的方法,newProduct(),可以创建不同档次的产品。
具体工厂:主要在抽象工厂中实现几种抽象方法,完成具体产品的创建。
摘要产品:它定义了产品规格,描述了产品的主要特征和功能。抽象工厂有很多抽象产品。
具体产品:实现抽象产品角色定义的接口,由具体工厂创建,与具体工厂有多对一的关系。
请看下面的例子。我们用小米和华为的例子来实现抽象工厂。
/**
*抽象产品工厂
*
* @作者kimariyb
*/
公共接口ProductFactory {
/**
*生产移动电话
* @返回制造的手机型号
*/
phone product phone product();
/**
*生产路由器
* @返回制造的路由器型号
*/
router product router product();
}
/**
*手机产品界面
*
* @作者kimariyb
*/
公共接口电话产品{
void start();
void close();
void call();
}
/**
*路由器接口
*
* @作者kimariyb
*/
公共接口路由器产品{
void start();
void close();
void SentWeb();
}
/**
*小米手机
*
* @作者kimariyb
*/
公共类小米手机实现PhoneProduct{
@覆盖
public void start(){ 0
System.out.println('小米手机开机');
}
@覆盖
public void close(){ 0
System.out.println('小米手机关机');
}
@覆盖
public void call(){ 0
System.out.println('小米手机通话');
}
}
/**
*华为手机
*
* @作者kimariyb
*/
公共类HuaweiPhone实现PhoneProduct{
@覆盖
public void start(){ 0
System.out.println('华为手机开机');
}
@覆盖
public void close(){ 0
System.out.println('华为手机关机');
}
@覆盖
public void call(){ 0
System.out.println('华为手机通话');
}
}
/**
*小米路由器
*
* @作者kimariyb
*/
公共类小米路由器实现RouterProduct{
@覆盖
public void start(){ 0
System.out.println('小米路由器开启');
}
@覆盖
public void close(){ 0
System.out.println('小米路由器关闭');
}
@覆盖
public void sent WeB(){ 0
System.out.println('小米路由器发送网络');
}
}
/**
*华为路由器
*
* @作者kimariyb
*/
公共类HuaweiRouter实现RouterProduct{
@覆盖
public void start(){ 0
System.out.println('华为路由器开机');
}
@覆盖
public void close(){ 0
System.out.println('华为路由器关机');
}
@覆盖
public void send WeB(){ 0
System.out.println('华为路由器发送网络');
}
}
/**
* 小米工厂
* @作者kimariyb
*/
公共类小米工厂实现ProductFactory {
@覆盖
公共电话产品电话产品(){ 0
返回新的小米手机();
}
@覆盖
公共路由器产品路由器产品()
返回新的小米路由器();
}
}
/**
* 华为工厂
*
* @作者kimariyb
*/
公共类华威工厂实现了ProductFactory {
@覆盖
公共电话产品电话产品(){ 0
返回新的华威手机();
}
@覆盖
公共路由器产品路由器产品()
返回新的huaweiouter();
}
}
简单的分析改实例,小米和华为都能生产手机和路由器,很显然这涉及到了产品族,需要使用抽象工厂模式来实现。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/112513.html