概念:
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。
角色:
抽象工厂模式中存在四种角色,分别是抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色。
抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
应用场景:
-
一个系统要由多个产品系列中的一个来配置时。
-
需要强调一系列相关的产品对象的设计以便进行联合使用时。
-
提供一个产品类库,而只想显示它们的接口而不是实现时。
优缺点:
优点
(1)分离了具体的类。客户通过抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
(2)易于交换产品系列。一个具体工厂类只在初始化时出现一次,这使得改变一个应用的具体工厂变得很容易,只需改变具体的工厂即可使用不同的产品配置。
(3)有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
缺点
难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品。
DEMO:
package com.创建型模式.抽象工厂模式;
/**
* 抽象玩具车
* 抽象产品角色:
* 担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
* 它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
*/
public interface AbstractToyCar {
/**
* 组装玩具
*/
public void assembleToy();
/**
* 给玩具上色
*/
public void coloringToy();
}
package com.创建型模式.抽象工厂模式;
/**
* 抽象玩具飞机
* 抽象产品角色:
* 担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
* 它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
*/
public interface AbstractToyPlane {
/**
* 组装玩具
*/
public void assembleToy();
/**
* 给玩具上色
*/
public void coloringToy();
}
package com.创建型模式.抽象工厂模式;
/**
* 具体玩具车
* 具体产品角色:
* 抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
* 它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
*/
public class toyCar implements AbstractToyCar{
/**
* 组装玩具车
*/
@Override
public void assembleToy() {
System.out.println("组装玩具车");
}
/**
* 玩具车着色
*/
@Override
public void coloringToy() {
System.out.println("玩具车着色");
}
}
package com.创建型模式.抽象工厂模式;
/**
* 具体玩具飞机
* 具体产品角色:
* 抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
* 它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
*/
public class toyPlane implements AbstractToyPlane{
/**
* 组装玩具飞机
*/
@Override
public void assembleToy() {
System.out.println("组装玩具飞机");
}
/**
* 玩具飞机着色
*/
@Override
public void coloringToy() {
System.out.println("玩具飞机着色");
}
}
package com.创建型模式.抽象工厂模式;
/**
* 抽象玩具工厂
* 抽象工厂角色:
* 担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
* 它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
*/
public interface AbstractFactory {
/**
* 获取玩具车对象
* 制造玩具车
* @return
*/
public AbstractToyCar makeCar();
/**
* 获取玩具飞机对象
* 制造玩具飞机
* @return
*/
public AbstractToyPlane makePlane();
}
package com.创建型模式.抽象工厂模式;
/**
* 工厂A,可以制造玩具车和玩具飞机
* 具体工厂角色:
* 这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
* 它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
*/
public class FactoryA implements AbstractFactory {
/**
* 制造玩具车
* @return
*/
@Override
public AbstractToyCar makeCar() {
System.out.println("工厂A制造玩具车");
return new toyCar();
}
/**
* 制造玩具飞机
* @return
*/
@Override
public AbstractToyPlane makePlane() {
System.out.println("工厂A制造玩具飞机");
return new toyPlane();
}
}
package com.创建型模式.抽象工厂模式;
/**
* 工厂B,可以制造玩具车和玩具飞机
* 具体工厂角色:
* 这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
* 它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
*/
public class FactoryB implements AbstractFactory {
/**
* 制造玩具车
* @return
*/
@Override
public AbstractToyCar makeCar() {
System.out.println("工厂B制造玩具车");
return new toyCar();
}
/**
* 制造玩具飞机
* @return
*/
@Override
public AbstractToyPlane makePlane() {
System.out.println("工厂B制造玩具飞机");
return new toyPlane();
}
}
package com.创建型模式.抽象工厂模式;
public class Client {
public static void main(String[] args) {
//工厂A 制造玩具车和玩具飞机
AbstractFactory factoryA=new FactoryA();
//制造玩具车
AbstractToyCar carA= factoryA.makeCar();
carA.assembleToy();
carA.coloringToy();
//制造玩具飞机
AbstractToyPlane planeA=factoryA.makePlane();
planeA.assembleToy();
planeA.coloringToy();
System.out.println("-----------------------");
//工厂B 制造玩具车和玩具飞机
AbstractFactory factoryB=new FactoryB();
//制造玩具车
AbstractToyCar carB= factoryB.makeCar();
carB.assembleToy();
carB.coloringToy();
//制造玩具飞机
AbstractToyPlane planeB=factoryB.makePlane();
planeB.assembleToy();
planeB.coloringToy();
}
}
工厂A制造玩具车
组装玩具车
玩具车着色
工厂A制造玩具飞机
组装玩具飞机
玩具飞机着色
-----------------------
工厂B制造玩具车
组装玩具车
玩具车着色
工厂B制造玩具飞机
组装玩具飞机
玩具飞机着色进程已结束,退出代码为 0