我有以下的阶级等级:
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(基于适当的模式)是否正确?或者更像是一个简单的工厂?
对不起,名单太多了.:)
发布于 2017-06-05 20:45:01
我不这么认为。
1) ProductExtractorFactory是一个具体的类,在AbstractFactory模式中,以抽象开始的类是/应该是一个抽象类。
2)在抽象工厂中,每个工厂都应该有一个具体的RateSheetProductExtractor子类型,但在代码示例中,我没有看到它们。
3)您的示例更像是一个带有复合模式的工厂。
使用复合的重构:
定义通用工厂接口:
public interface RateSheetProductExtractorFactory{
public RateSheetProductExtractor getProductExtractor(TablePlanType tablePlanType, TableRatingType ratingType);
}定义复合类:
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);
}
}实现每个提取器及其各自的工厂:
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:
<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>发布于 2017-06-05 20:47:39
我的两分钱就是保留这个名字。我不确定您的工作场所,但是在我以前的组织中,如果类名是抽象类,而具体的类必须实现它的方法,我们通常将类名保留为AbstractSomeClass。如果您还检查了,那么从抽象开始的所有类都与这个概念有关,而不是与设计模式有关。
https://stackoverflow.com/questions/44377275
复制相似问题