抽象工厂模式:是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。它属于创建型模式,提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式UML类图如下:
从类图可以看出抽象工厂模式包含4个元素:
抽象工厂:声明了一组用于创建多种产品的抽象方法。
具体工厂:继承抽象工厂类,生成一组具体产品。
抽象产品:为各种产品声明抽象接口或抽象类。
具体产品:抽象产品类的实现类,为实现某个具体产品的对象。
抽象工厂代码:
package com.szcatic.factory.abstracter;
/**
* 抽象工厂
* @author zsx
*
*/
public abstract class AbstractFactory {
public abstract IMouse createMouse();
public abstract IKeyboard creatKeyboard();
}
具体工厂代码:
package com.szcatic.factory.abstracter;
/**
* 具体工厂
* @author zsx
*
*/
public class DellFactory extends AbstractFactory {
@Override
public IMouse createMouse() {
return new DellMouse();
}
@Override
public IKeyboard creatKeyboard() {
return new DellKeyboard();
}
}
package com.szcatic.factory.abstracter;
/**
* 具体工厂
* @author zsx
*
*/
public class LenovoFactory extends AbstractFactory {
@Override
public IMouse createMouse() {
return new LenovoMouse();
}
@Override
public IKeyboard creatKeyboard() {
return new LenovoKeyboard();
}
}
抽象产品代码:
package com.szcatic.factory.abstracter;
/**
* 抽象产品
* @author zsx
*
*/
public interface IKeyboard {
void produceKeyboard();
}
package com.szcatic.factory.abstracter;
/**
* 抽象产品
* @author zsx
*
*/
public interface IMouse {
void produceMouse();
}
具体产品代码:
/**
* 具体产品
* @author zsx
*
*/
public class LenovoKeyboard implements IKeyboard {
@Override
public void produceKeyboard() {
System.out.println("生产联想键盘");
}
}
package com.szcatic.factory.abstracter;
/**
* 具体产品
* @author zsx
*
*/
public class LenovoMouse implements IMouse {
@Override
public void produceMouse() {
System.out.println("生产联想鼠标");
}
}
package com.szcatic.factory.abstracter;
/**
* 具体产品
* @author zsx
*
*/
public class DellKeyboard implements IKeyboard {
@Override
public void produceKeyboard() {
System.out.println("生产戴尔键盘");
}
}
package com.szcatic.factory.abstracter;
/**
* 具体产品
* @author zsx
*
*/
public class DellMouse implements IMouse{
@Override
public void produceMouse() {
System.out.println("生产戴尔鼠标");
}
}
测试类:
package com.szcatic.test.factory;
import org.junit.jupiter.api.Test;
import com.szcatic.factory.abstracter.AbstractFactory;
import com.szcatic.factory.abstracter.IMouse;
import com.szcatic.factory.abstracter.LenovoFactory;
public class AbstractFactoryTest {
@Test
void produceMouse() {
AbstractFactory factory = new LenovoFactory();
IMouse mouse = factory.createMouse();
mouse.produceMouse();
}
}
测试结果:
生产联想鼠标
总结
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。