一、抽象工厂模式(创建型模式)
1.定义
抽象工厂模式(Abstract Factory Pattern)是提供一个创建一系列相关或相互依赖的产品(也可以说是同一产品族不同等级的产品)的接口,客户端不依赖于产品的具体实现细节,强调的是一起使用一系列的相关产品。所有的产品以同样的接口实现,从而使客户端不依赖于具体实现。
**注:**一系列产品的意思就是同一产品族,看完下面的代码示例中的宝马的发动机和logo就属于同一产品族,不同等级的产品意思不同的产品。
2.抽象工厂模式中的角色
**(1).抽象工厂(AbstractFactory):**提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
**(2).具体工厂(ConcreteFactory):**主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
(**3).抽象产品(Product):**定义了产品的规范,描述了产品的主要特性和功能。
**(4).具体产品(ConcreteProduct):**实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
3.具体实例
(1).场景:
一个汽车生产厂家,负责生产宝马车和奔驰车,车的组合肯定会有发动机和logo(这里就举例这两个),而且这两个是要一起使用才能组装成一辆完整的车,下面就以这两个产品来实现抽象工厂模式
(2).抽象工厂模式
package com.tw.designPattern.factory.abstractFactory;
/**
* 抽象角色 发动机
*/
public interface Engine {
void info();
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 具体角色 宝马发动机
*/
public class BMWEngine implements Engine{
@Override
public void info() {
System.out.println("宝马发动机。");
}
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 具体角色 奔驰发动机
*/
public class BenzEngine implements Engine{
@Override
public void info() {
System.out.println("奔驰发动机。");
}
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 抽象角色 logo
*/
public interface Logo {
void info();
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 具体角色 宝马logo
*/
public class BMWLogo implements Logo{
@Override
public void info() {
System.out.println("宝马车标。");
}
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 具体角色 奔驰车标
*/
public class BenzLogo implements Logo{
@Override
public void info() {
System.out.println("奔驰车标。");
}
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 抽象角色 汽车工厂
*/
public interface CarFactory {
/**
* 生产发动机
* @return
*/
Engine productEngine();
/**
* 生产log
* @return
*/
Logo productLogo();
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 具体工厂 宝马工厂
*/
public class BMWFactory implements CarFactory{
@Override
public Engine productEngine() {
return new BMWEngine();
}
@Override
public Logo productLogo() {
return new BMWLogo();
}
}
package com.tw.designPattern.factory.abstractFactory;
/**
* 具体工厂 奔驰工厂
*/
public class BenzFactory implements CarFactory{
@Override
public Engine productEngine() {
return new BenzEngine();
}
@Override
public Logo productLogo() {
return new BenzLogo();
}
}
package com.tw.designPattern.factory.abstractFactory;
public class FactoryTest {
public static void main(String[] args) {
// 创建宝马工厂
BMWFactory bmwFactory = new BMWFactory();
// 宝马发动机
Engine bmwEngine = bmwFactory.productEngine();
// 宝马车标
Logo bmwLogo = bmwFactory.productLogo();
bmwEngine.info();
bmwLogo.info();
// 创建奔驰工厂
BenzFactory benzFactory = new BenzFactory();
// 奔驰发动机
Engine benzEngine = benzFactory.productEngine();
// 奔驰车标
Logo benzLogo = benzFactory.productLogo();
benzEngine.info();
benzLogo.info();
}
}
测试结果:
宝马发动机。
宝马车标。
奔驰发动机。
奔驰车标。
下面会列举一下抽象工厂模式的优缺点和实际应用场景。
4.优缺点
(1).优点:
(1-1).抽象工厂模式创建用户所需的产品时,用户无需关心产品的创建细节,只需知道创建的产品所对应的工厂。
(2).缺点:
(2-1).定好了产品族种所有产品的集合,当新增产品的时候需要修改相应的工厂类方法,不符合开闭原则。
5.应用场景
(1).当需要创建同一产品族不同等级的产品的时候,用户不需要知道产品创建细节的时候,就比如汽车制造。
6.附上代码图片方便手机端查看
注:内容参考网络上各种资料,还有一些本人的理解和思想,仅为了学习记录和分享一下自己所学之处,如有不足的地方麻烦大牛指出,如有侵权的地方,请联系删除,谢谢。