抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而 无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式,与工厂方法模式相比它可以创建一组对象,不像工厂模式每个工厂只能生成一种产品;
//抽象产品A 例如是手机
public abstract class AbstProductA {
public abstract void AbsProAInfo();
}
//具体产品 例如是华为手机
public class ConcreteProductA1 extends AbstProductA {
@Override
public void AbsProAInfo() {
System.out.println("I am productA1");
}
}
//具体产品 例如是苹果手机
public class ConcreteProductA2 extends AbstProductA {
@Override
public void AbsProAInfo() {
System.out.println("I am productA2");
}
}
//抽象产品A 例如电脑
public abstract class AbstProductB {
public abstract void AbsProBInfo();
}
//具体产品 例如是华为电脑
public class ConcreteProductB1 extends AbstProductB {
@Override
public void AbsProBInfo() {
System.out.println("I am productB1");
}
}
//具体产品 例如是苹果电脑
public class ConcreteProductB2 extends AbstProductB {
@Override
public void AbsProBInfo() {
System.out.println("I am productB2");
}
}
//抽象工厂 ,这个工厂可以生成手机和电脑
public interface AbsFactory {
public AbstProductA createAbstactProductA();
public AbstProductB createAbstactProductB();
}
//具体的工厂,例如我是华为工厂,我可以生成华为手机和华为电脑
public class ConcreteFactory1 implements AbsFactory {
@Override
public AbstProductA createAbstactProductA() {
ConcreteProductA1 concreteProductA1 = new ConcreteProductA1();
//对concreteProductA1进行其他操作
return concreteProductA1;
}
@Override
public AbstProductB createAbstactProductB() {
ConcreteProductB1 concreteProductB1 = new ConcreteProductB1();
//对concreteProductA1进行其他操作
return concreteProductB1;
}
}
//具体的工厂,例如我是苹果工厂,我可以生成苹果手机和苹果电脑
public class ConcreteFactory2 implements AbsFactory {
@Override
public AbstProductA createAbstactProductA() {
ConcreteProductA2 concreteProductA2 = new ConcreteProductA2();
//对concreteProductA1进行其他操作
return concreteProductA2;
}
@Override
public AbstProductB createAbstactProductB() {
ConcreteProductB2 concreteProductB2 = new ConcreteProductB2();
//对concreteProductA1进行其他操作
return concreteProductB2;
}
}
/**
* 客户端只要知道具体的要使用那个工厂,就可以创建对应产品;
* 每个具体工厂的所有产品构成了一个产品族,可以包括多种产品;
* 使用那个具体的工厂我们可以将具体的工厂类名配置到配置文件中,通过反射的方式,就不用new的方式;
*/
public class AbsClient {
public static void main(String[] args) {
ConcreteFactory2 factory = new ConcreteFactory2();
factory.createAbstactProductA().AbsProAInfo();
factory.createAbstactProductB().AbsProBInfo();
}
}
优点:
-
抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离, 更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接 口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为
-
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象
-
增加新的产品族很方便,无须修改已有系统,符合“开闭原则”,比如我新增加小米手机、小米电脑时只需要添加具体的小米手机电脑类和一个具体的生成小米的工厂;
缺点:
-
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码, 这显然会带来较大的不便,违背了“开闭原则”,例如如果我们需要添加一种新的产品如空调时,就必须修改抽象工厂;
使用场景
-
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工 厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦
-
系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来 使得用户可以动态改变产品族,也可以很方便地增加新的产品族
-
属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个 产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作 系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统 的,此时具有一个共同的约束条件:操作系统的类型
-
产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构,比如,一个博客网站样式有哪些元素(编辑器,评论等),这些是一开始就定好的,我们只是定义了几种可供用户使用的格式,所有这些元素是的新增或者删除就不应发生;