举例说明:
/**
* 作者:wanglei
* 邮箱:229846388@qq.com
* 抽象工厂模式
* 工厂类
*/
abstract class Factory {
/**
* @return 制造容器
*/
public abstract Product ManufactureContainer();
/**
* @return 制造模具
*/
public abstract Product ManufactureMould();
}
/**
* A厂 - 生产模具+容器产品
*/
class FactoryA extends Factory{
@Override
public Product ManufactureContainer() {
return new ContainerProductA();
}
@Override
public Product ManufactureMould() {
return new MouldProductA();
}
}
/**
*B厂 - 生产模具+容器产品
*/
class FactoryB extends Factory{
@Override
public Product ManufactureContainer() {
return new ContainerProductB();
}
@Override
public Product ManufactureMould() {
return new MouldProductB();
}
}
/**
* 作者:wanglei
* 邮箱:229846388@qq.com
* 抽象工厂模式
* 抽象产品族类
*/
abstract class Product {
public abstract void show();
}
/**
* 容器产品抽象类
*/
abstract class ContainerProduct extends Product {
@Override
public void show() {
}
}
/**
* 模具产品抽象类
*/
abstract class MouldProduct extends Product{
@Override
public void show() {
}
}
/**
* 容器产品A类
*/
class ContainerProductA extends ContainerProduct{
@Override
public void show() {
System.out.println("生产出了容器产品A");
}
}
/**
* 容器产品B类
*/
class ContainerProductB extends ContainerProduct{
@Override
public void show() {
System.out.println("生产出了容器产品B");
}
}
/**
* 模具产品A类
*/
class MouldProductA extends MouldProduct{
@Override
public void show() {
System.out.println("生产出了模具产品A");
}
}
/**
* 模具产品B类
*/
class MouldProductB extends MouldProduct{
@Override
public void show() {
System.out.println("生产出了模具产品B");
}
}
/**
* 作者:wanglei
* 邮箱:229846388@qq.com
* 抽象工厂模式
* 定义:
* 1.抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
* 2.抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
* 主要作用:
* 1.允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
* 解决的问题:
* 每个工厂只能创建一类产品,即工厂方法模式的缺点
* 实例概况:
* 背景:小成有两间塑料加工厂(A厂仅生产容器类产品;B厂仅生产模具类产品);随着客户需求的变化,A厂所在地的客户需要也模具类产品,B厂所在地的客户也需要容器类产品;
* 冲突:没有资源(资金+租位)在当地分别开设多一家注塑分厂
* 解决方案:在原有的两家塑料厂里增设生产需求的功能,即A厂能生产容器+模具产品;B厂间能生产模具+容器产品。
*/
public class SimpleFactoryPattern {
public static void main(String[] args) {
FactoryA factoryA = new FactoryA();
FactoryB factoryB = new FactoryB();
//A厂当地客户需要容器产品A
factoryA.ManufactureContainer().show();
//A厂当地客户需要模具产品A
factoryA.ManufactureMould().show();
//B厂当地客户需要容器产品B
factoryB.ManufactureContainer().show();
//B厂当地客户需要模具产品B
factoryB.ManufactureMould().show();
}
}
/**
* 结果:
* 生产出了容器产品A
* 生产出了模具产品A
* 生产出了容器产品B
* 生产出了模具产品B
* 优点:
* 1.降低耦合:
* 抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
* 2.更符合开-闭原则:
* 新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可::简单工厂模式需要修改工厂类的判断逻辑
* 3.符合单一职责原则:
* 每个具体工厂类只负责创建对应的产品::简单工厂中的工厂类存在复杂的switch逻辑判断
* 4.不使用静态工厂方法,可以形成基于继承的等级结构。::简单工厂模式的工厂类使用静态工厂方法
* 缺点:
* 1.抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
* 2.对于新的产品族符合开-闭原则;对于新的产品种类不符合开-闭原则,这一特性称为开-闭原则的倾斜性。
* 应用场景:
* 1.一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
* 2.这个系统有多个系列产品,而系统中只消费其中某一系列产品
* 3.系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
*/
网友评论