定义
为创建一组相关或相互依赖得对象提供一个接口,而且无须指定它们的具体类
优缺点
- 优点
- 封装性,每个产品的实现类不是高层模块要关系的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出来,
这由谁负责呢?工厂类,只要自导工厂类是谁,我就能创建出一个需要的对象,省时省力。 - 产品族内的约束为非公开状态。
- 封装性,每个产品的实现类不是高层模块要关系的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出来,
- 缺点
- 产品族的扩展非常困难
使用场景
- 一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
代码实现
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:35
*/
public abstract class AbstractProductA {
/**
* 每个产品公共的方法
*/
public void shareMethod(){
}
/**
* 每个产品相同的方法,不同的实现
*/
public abstract void doSomething();
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:38
*/
public class ProductA1 extends AbstractProductA {
@Override
public void doSomething() {
System.out.println("产品A1的实现");
}
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:39
*/
public class ProductA2 extends AbstractProductA {
@Override
public void doSomething() {
System.out.println("产品A2的实现");
}
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:39
*/
public abstract class AbstractProductB {
/**
* 每个产品公共的方法
*/
public void shareMethod(){
}
/**
* 每个产品相同的方法,不同的实现
*/
public abstract void doSomething();
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:40
*/
public class ProductB1 extends AbstractProductB {
@Override
public void doSomething() {
System.out.println("产品B1的实现");
}
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:40
*/
public class ProductB2 extends AbstractProductB {
@Override
public void doSomething() {
System.out.println("产品B2的实现");
}
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:41
*/
public abstract class AbstractCreator {
/**
* 有N个产品族 在抽象工厂类就应该有N个创建方法
*/
/**
* 创建A产品家族
* @return
*/
public abstract AbstractProductA createProductA();
/**
* 创建B产品家族
* @return
*/
public abstract AbstractProductB createProductB();
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:35
*/
public abstract class AbstractProductA {
/**
* 每个产品公共的方法
*/
public void shareMethod(){
}
/**
* 每个产品相同的方法,不同的实现
*/
public abstract void doSomething();
}
package com.lidaxia.design.pattern.creational.abstractfactory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/22 21:39
*/
public abstract class AbstractProductB {
/**
* 每个产品公共的方法
*/
public void shareMethod(){
}
/**
* 每个产品相同的方法,不同的实现
*/
public abstract void doSomething();
}