首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合工厂或抽象工厂

复合工厂或抽象工厂
EN

Stack Overflow用户
提问于 2017-06-05 20:36:13
回答 2查看 580关注 0票数 0

我有以下的阶级等级:

代码语言:javascript
复制
public interface RateSheetProductExtractor
{
  List<ProductData> extract(SGQuotingData quotingData);
}


@Service
@Scope("requestjob")
public class ProductExtractorFactory
{
  @Autowired
  private OptionalRatingProductExtractorFactory optionalRatingProductExtractorFactory;
  @Autowired
  private QuotePlanProductExtractorFactory quotePlanProductExtractorFactory;
  @Autowired
  private AlternateProductExtractorFactory alternateProductExtractorFactory;

  public RateSheetProductExtractor getProductExtractor(
    TablePlanType tablePlanType,
    TableRatingType ratingType)
  {
    switch (tablePlanType)
    {
      case QUOTED:
        return quotePlanProductExtractorFactory.getInstance(ratingType);
      case OPTIONAL:
        return optionalRatingProductExtractorFactory.getInstance(ratingType);
      case ALTERNATE:
        return alternateProductExtractorFactory.getInstance(ratingType);
      default:
        throw new IllegalArgumentException(tablePlanType + " is unsupported yet.");
    }
  }
}

@Service
@Scope("requestjob")
public class OptionalRatingProductExtractorFactory
{
  @Autowired
  private AcaProductExtractor acaProductExtractor;
  @Autowired
  private AgeRatedAsCompositeProductExtractor ageRatedAsCompositeProductExtractor;

  public RateSheetProductExtractor getInstance(TableRatingType ratingType)
  {
    switch (ratingType)
    {
      case AGE:
        return ageRatedAsCompositeProductExtractor;
      case COMPOSITE:
        return acaProductExtractor;
      default:
        throw new IllegalArgumentException(
          "Product extractor isn't defined for optional plan type and rating type " + ratingType);

    }
  }
}


@Service
@Scope("requestjob")
public class QuotePlanProductExtractorFactory
{
  @Autowired
  private GfProductExtractor gfExtractor;
  @Autowired
  private AgeRatedProductExtractor ageRatedProductExtractor;
  @Autowired
  private MedicalProductExtractor medicalProductExtractor;

  public RateSheetProductExtractor getInstance(TableRatingType ratingType)
  {
    switch (ratingType)
    {
      case AGE:
        return ageRatedProductExtractor;
      case COMPOSITE_AGE:
        return gfExtractor;
      case COMPOSITE:
        return medicalProductExtractor;
      default:
        throw new IllegalArgumentException(
          ratingType + " is unsupported for QuotePlan product extractor factory.");
    }
  }
}


@Service
@Scope("requestjob")
public class AlternateProductExtractorFactory
{
  @Autowired
  private AlternateAgeRatedProductExtractor ageRatedProductExtractor;

  public RateSheetProductExtractor getInstance(TableRatingType ratingType)
  {
    if (ratingType == AGE)
    {
      return ageRatedProductExtractor;
    }
    throw new IllegalArgumentException(
      ratingType + " is unsupported for QuotePlan product extractor factory.");
  }
}

将ProductExtractorFactory称为AbstractProductExtractorFactory(基于适当的模式)是否正确?或者更像是一个简单的工厂?

对不起,名单太多了.:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-05 20:45:01

我不这么认为。

1) ProductExtractorFactory是一个具体的类,在AbstractFactory模式中,以抽象开始的类是/应该是一个抽象类。

2)在抽象工厂中,每个工厂都应该有一个具体的RateSheetProductExtractor子类型,但在代码示例中,我没有看到它们。

3)您的示例更像是一个带有复合模式的工厂。

使用复合的重构:

定义通用工厂接口:

代码语言:javascript
复制
public interface RateSheetProductExtractorFactory{

    public RateSheetProductExtractor getProductExtractor(TablePlanType tablePlanType, TableRatingType ratingType);
}

定义复合类:

代码语言:javascript
复制
public class CompositeRateSheetProductExtractorFactory implements RateSheetProductExtractorFactory{
    private Map<String, RateSheetProductExtractorFactory> factoryMap = null;

    public void setFactoryMap(Map<String, RateSheetProductExtractorFactory> factoryMap){
        this.factoryMap = factoryMap;
    }

    @Override
    public RateSheetProductExtractor getProductExtractor(TablePlanType tablePlanType, TableRatingType ratingType){
        RateSheetProductExtractorFactory factory = factoryMap.get( tablePlanType + "-" + ratingType );

        if (factory == null) throw new IllegalArgumentException( tablePlanType + "-" + ratingType + " is unsupported yet.");

        return factory.getProductExtractor(tablePlanType, ratingType);
    }        
}

实现每个提取器及其各自的工厂:

代码语言:javascript
复制
public class AcaProductExtractorFactory implements RateSheetProductExtractorFactory{

    @Override
    public RateSheetProductExtractor getProductExtractor(TablePlanType tablePlanType, TableRatingType ratingType){
        return new AcaProductExtractor();
    }
}

public class AcaProductExtractor implements RateSheetProductExtractor{

    @Override
    public List<ProductData> extract(SGQuotingData quotingData) {
        return null;
    }        
}



public class AgeRatedAsCompositeProductExtractorFactory implements RateSheetProductExtractorFactory{

    @Override
    public RateSheetProductExtractor getProductExtractor(TablePlanType tablePlanType, TableRatingType ratingType){
        return new AgeRatedAsCompositeProductExtractor();
    }
}

public class AgeRatedAsCompositeProductExtractor implements RateSheetProductExtractor{

    @Override
    public List<ProductData> extract(SGQuotingData quotingData) {
        return null;
    }        
}



public class MedicalProductExtractorFactory implements RateSheetProductExtractorFactory{

    @Override
    public RateSheetProductExtractor getProductExtractor(TablePlanType tablePlanType, TableRatingType ratingType){
        return new MedicalProductExtractor();
    }
}

public class MedicalProductExtractor implements RateSheetProductExtractor{
    @Override
    public List<ProductData> extract(SGQuotingData quotingData) {
        return null;
    }       
}

Spring:

代码语言:javascript
复制
<bean id="ageRatedAsCompositeProductExtractorFactory" class="AgeRatedAsCompositeProductExtractorFactory"/>
<bean id="medicalProductExtractorFactory" class="MedicalProductExtractorFactory"/>
<bean id="acaProductExtractorFactory" class="AcaProductExtractorFactory"/>

<bean id="extractorFactory" class="CompositeRateSheetProductExtractorFactory">
    <property name="factoryMap">
        <map>
            <entry key="QUOTED-AGE" value-ref="ageRatedAsCompositeProductExtractorFactory" />
            <entry key="QUOTED-COMPOSITE" value-ref="medicalProductExtractorFactory" />
            <entry key="ALTERNATE-AGE" value-ref="ageRatedAsCompositeProductExtractorFactory" />
            <entry key="OPTIONAL-COMPOSITE" value-ref="acaProductExtractorFactory" />
        </map>
    </property>
</bean>
票数 1
EN

Stack Overflow用户

发布于 2017-06-05 20:47:39

我的两分钱就是保留这个名字。我不确定您的工作场所,但是在我以前的组织中,如果类名是抽象类,而具体的类必须实现它的方法,我们通常将类名保留为AbstractSomeClass。如果您还检查了,那么从抽象开始的所有类都与这个概念有关,而不是与设计模式有关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44377275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档