设计模式2:抽象工厂模式(Abstract Factory)
2019-04-23 本文已影响0人
ygxing
1.简介
抽象工厂是创建模式中的一种
弥补了工厂方法的不足,抽象工厂可以制造一系列的产品,
例如一个工厂既可以生产PC,又可以生产鼠标
1.1优点:
- 将一组具体的产品构造放在具体工厂类里,扩展一个工厂较为方便
- 客户端可以通过工厂创建一系列产品,不需要知道创建产品的细节,不需要执行new操作
1.2缺点:
- 当新增一个产品的时候,可能需要修改工厂,扩展比较困难
1.3使用场景
- 逻辑和工厂制造产品相似的业务
2.实现方式
2.1 具体逻辑
- 两个工厂,分别是DellFactory和LenovoFactory
- 两个抽象的产品,分别是AbstractPCProduct和AbstractMouseProduct,
- DellFactory可以生产PC和Mouse,分别是DellPCProduct和DellMouseProduct
- LenovoFactory也可以生产PC和Mouse,分别是LenovoPCProduct和LenovoMouseProduct
2.1.1 接口
定义了两个接口,IProduct和IFactory,
IProduct是所有产品的父接口,
IFactory是所有共产的父接口
/**
* 产品接口
*/
public interface IProduct {
/**
* 打印名称
*/
void name();
}
/**
* 工厂接口
*/
public interface IFactory {
/**
* 制造PC
* @return
*/
AbstractPCProduct productPC();
/**
* 制造鼠标
* @return
*/
AbstractMouseProduct productMouse();
}
2.1.1 抽象的产品
定义了两个抽象的产品AbstractPCProduct和AbstractMouseProduct,
继承了IProduct接口,
使用抽象类,规定好通用的参数和方法
/**
* 抽象PC产品
*/
public abstract class AbstractPCProduct implements IProduct {
/**
* 产品名称
*/
String name = "";
@Override
public void name() {
System.out.println(name + "的PC产品");
}
}
/**
* 抽象鼠标产品
*/
public abstract class AbstractMouseProduct implements IProduct {
/**
* 产品名称
*/
String name = "";
@Override
public void name() {
System.out.println(name + "鼠标产品");
}
}
DELL相关
定义了两个Dell的Product,继承了AbstractPCProduct抽象类,
一个DellFactory实现了IFactory接口,
用于生产DellPCProduct和DellMouseProduct
/**
* Dell PC产品
*/
public class DellPCProduct extends AbstractPCProduct {
{
//名称为dell
this.name = "Dell";
}
}
/**
* Dell鼠标产品
*/
public class DellMouseProduct extends AbstractMouseProduct {
{
//名称为dell
this.name = "Dell";
}
}
/**
* Dell工厂
*/
public class DellFactory implements IFactory {
@Override
public AbstractPCProduct productPC() {
// 生产Dell PC
return new DellPCProduct();
}
@Override
public AbstractMouseProduct productMouse() {
// 生产Dell鼠标
return new DellMouseProduct();
}
}
lenovo相关
定义了两lenovo的Product,继承了AbstractPCProduct抽象类,
一个LenovoFactory实现了IFactory接口,
用于生产LenovoPCProduct和LenovoMouseProduct
/**
* Lenovo PC产品
*/
public class LenovoPCProduct extends AbstractPCProduct {
{
// 名称为Lenovo
this.name = "Lenovo";
}
}
/**
* Lenovo鼠标产品
*/
public class LenovoMouseProduct extends AbstractMouseProduct {
{
// 名称为Lenovo
this.name = "Lenovo";
}
}
//lenovo 工厂
public class LenovoFactory implements IFactory {
@Override
public AbstractPCProduct productPC() {
// 生产lenovo PC产品
return new LenovoPCProduct();
}
@Override
public AbstractMouseProduct productMouse() {
// 生产lenovo 鼠标产品
return new LenovoMouseProduct();
}
}
类图
抽象工厂测试类
//抽象工厂测试类
public class FactoryAbstractTest {
public static void main(String[] args) {
String s1 = "dell";
String s2 = "lenovo";
IFactory f1 = getFactory(s1);
IFactory f2 = getFactory(s2);
f1.productMouse().name();
f1.productPC().name();
f2.productMouse().name();
f2.productPC().name();
}
/**
* 获取对应的工厂
*/
private static IFactory getFactory(String name) {
if ("dell".equals(name)) {
return new DellFactory();
} else if ("lenovo".equals(name)) {
return new LenovoFactory();
}
throw new RuntimeException("name error...");
}
}
运行结果:
Dell的鼠标产品
Dell的PC产品
Lenovo的鼠标产品
Lenovo的PC产品