抽象工厂模式
抽象工厂, 工厂的根源在一个顶层接口 GeneralFactory 通过实现顶层接口来创建具体的产品生产工厂。 GeneralFactory 只依赖产品的抽象层, 具体的产品选择由具体的生产工厂决定。
demo
package creationalpattern.factorypattern;
/**
* @author tx
* @version 1.0
* @date 2024/1/5 22:20
* @description:
* 抽象工厂,
* 工厂的根源在一个顶层接口 GeneralFactory
* 通过实现顶层接口来创建具体的产品生产工厂。
* GeneralFactory 只依赖产品的抽象层,
* 具体的产品选择由具体的生产工厂决定。
*/
public class AbstractFactoryPattern {
public static void main(String[] args) {
// 创建A工厂
GeneralFactory aFactory = new AFactory();
// 通过工厂拿货
AAProduct aaProduct = aFactory.createAAProduct();
ABProduct abProduct = aFactory.createABProduct();
aaProduct.run();
abProduct.go();
// 创建B工厂
GeneralFactory bFactory = new BFactory();
// 通过工厂拿货
AAProduct aaProduct1 = bFactory.createAAProduct();
ABProduct abProduct1 = bFactory.createABProduct();
aaProduct1.run();
abProduct1.go();
}
}
/**
* 抽象产品A
*/
interface AAProduct{
/**
* 产品应该具备的功能
*/
void run();
}
class AAAProductImpl implements AAProduct{
/**
* 产品应该具备的功能
*/
@Override
public void run() {
System.out.println("产品A的A款");
}
}
class AABProductImpl implements AAProduct{
/**
* 产品应该具备的功能
*/
@Override
public void run() {
System.out.println("产品A的B款");
}
}
/**
* 抽象产品B
*/
interface ABProduct{
/**
* 产品应该具备的功能
*/
void go();
}
class ABAProductImpl implements ABProduct{
/**
* 产品应该具备的功能
*/
@Override
public void go() {
System.out.println("产品B的A款");
}
}
class ABBProductImpl implements ABProduct{
/**
* 产品应该具备的功能
*/
@Override
public void go() {
System.out.println("产品B的B款");
}
}
/**
* 抽象总工厂
*/
interface GeneralFactory{
AAProduct createAAProduct();
ABProduct createABProduct();
}
/**
* 生产产品 A 的 A 款,B 的 A 款
*/
class AFactory implements GeneralFactory{
/**
* @return A-A
*/
@Override
public AAProduct createAAProduct() {
return new AAAProductImpl();
}
/**
* @return B-A
*/
@Override
public ABProduct createABProduct() {
return new ABAProductImpl();
}
}
/**
* 生产产品 A 的 B 款,B 的 B 款
*/
class BFactory implements GeneralFactory{
/**
* @return A-B
*/
@Override
public AAProduct createAAProduct() {
return new AABProductImpl();
}
/**
* @return B-B
*/
@Override
public ABProduct createABProduct() {
return new ABBProductImpl();
}
}