设计模型之抽象工厂模式(含UML完整实例)
设计模型之抽象工厂模式1.抽象工厂模式1.1 定义与特点 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)。 使用抽象工厂模式一般要满足以下条件: 1).系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。 2).系统一次只可能消费其中某一族产品,即同族的产品一起使用。 抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:...
设计模型之抽象工厂模式
1.抽象工厂模式
1.1 定义与特点
用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)。
使用抽象工厂模式一般要满足以下条件:
1).系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
2).系统一次只可能消费其中某一族产品,即同族的产品一起使用。
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:
1).可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
2).当增加一个新的产品族时不需要修改原代码,满足开闭原则。
抽象工厂模式的缺点是:
1).当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
1.2 模式的结构
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法
newProduct(),可以创建多个不同等级的产品。 - 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
1.3 UML类图
1.4 问题由来
工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。
同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
1.5 解决思路
在代码设计层面,抽象工厂模式的结构同工厂方法模式的结构相似,不同的是其产品的种类不止一个,所以创建产品的方法也不止一个,所以只要增加创建不同种产品的方法,就可以实现抽象工厂模式
1.6 解决方案
/**
* @author tbb
* 工厂产品族接口类
*/
public interface Factory
{
WashingMachine createWashingMachine();
Refrigerator createRefrigerator();
}
/**
* @author tbb
* 海尔工厂产品族类
*/
public class HaierFactory implements Factory
{
@Override
public WashingMachine createWashingMachine()
{
return new HaierWashingMachine();
}
@Override
public Refrigerator createRefrigerator()
{
return new HaierRefrigerator();
}
}
/**
* @author tbb
* TCL工厂产品族类
*/
public class TCLFactory implements Factory {
@Override
public WashingMachine createWashingMachine()
{
return new TCLWashingMachine();
}
@Override
public Refrigerator createRefrigerator()
{
return new TCLRefrigerator();
}
}
/**
* @author tbb
* 冰箱接口类
*/
public interface Refrigerator
{
void brand();
}
/**
* @author tbb
* 洗衣机接口类
*/
public interface WashingMachine
{
/**
* 品牌
*/
void brand();
}
/**
* @author tbb
* 海尔品牌冰箱类
*/
public class HaierRefrigerator implements Refrigerator {
@Override
public void brand()
{
System.out.println("海尔品牌冰箱");
}
}
/**
* @author tbb
* 海尔品牌洗衣机类
*/
public class HaierWashingMachine implements WashingMachine{
@Override
public void brand()
{
System.out.println("海尔品牌洗衣机");
}
}
/**
* @author tbb
* TCL品牌冰箱类
*/
public class TCLRefrigerator implements Refrigerator{
@Override
public void brand() {
System.out.println("TCL品牌冰箱");
}
}
/**
* @author tbb
* TCL品牌洗衣机类
*/
public class TCLWashingMachine implements WashingMachine{
@Override
public void brand() {
System.out.println("TCL品牌洗衣机");
}
}
public class Test
{
public static void main(String[] args)
{
//客户想要Haier 品牌的 洗衣机和冰箱
HaierFactory haierFactory = new HaierFactory();
WashingMachine haierWashingMachine = haierFactory.createWashingMachine();
haierWashingMachine.brand();//海尔品牌洗衣机
Refrigerator refrigerator = haierFactory.createRefrigerator();
refrigerator.brand();//海尔品牌冰箱
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)