什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就抽象工厂模式简要概述。
什么是抽象工厂
抽象工厂是创建工厂的工厂,接口创建一个对象工厂,工厂内部按照规则产生对应的对象,我们不用关心内部如何创建工厂,如何创建对象,只需调用使用即可。这种设计模式属于创建型模式,是创建对象的最佳实现。
小试牛刀
首先创建一个公司CompanyService接口,创建南充北京成都三个子公司实现类;然后创建一个抽象工厂AbstractFactory,内部提供抽象方法getCompany,用来获取公司。再创建一个公司工厂CompanyTestFactory继承抽象工厂AbstractFactory,然后创建一个工厂生产者FactoryProducer用来生产工厂。从而达到用工厂创建工厂的目的。
关系图如下:
1、创建公司接口并产生北京 成都 南充三个公司实现类
public interface CompanyService {
void employUsers();
}
@Service
@Slf4j
public class BeijingCompanyServiceImpl implements CompanyService {
@Override
public void employUsers() {
log.error("this is a beijing company employ");
}
}
@Service
@Slf4j
public class ChengduCompanyServiceImpl implements CompanyService {
@Override
public void employUsers() {
log.error("this is a chengdu company employ");
}
}
@Service
@Slf4j
public class NanchongCompanyServiceImpl implements CompanyService {
@Override
public void employUsers() {
log.error("this is a nanchong company employ");
}
}
2、创建抽象工厂,也就是创建工厂的工厂;内部增加获取工厂的方法
public abstract class AbstractFactory {
public abstract CompanyService getCompany(String companyName);
}
3、创建公司工厂并继承抽象工厂类,工厂类中增加获取公司对象的方法
public class CompanyByTestFactory extends AbstractFactory {
public static final String BEIJING_COMPANY = "BEIJING_COMPANY";
public static final String CHENGDU_COMPANY = "CHENGDU_COMPANY";
public static final String NENCHONG_COMPANY = "NENCHONG_COMPANY";
@Override
public CompanyService getCompany(String companyName) {
switch (companyName) {
case BEIJING_COMPANY:
return new BeijingCompanyServiceImpl();
case CHENGDU_COMPANY:
return new ChengduCompanyServiceImpl();
default:
return new NanchongCompanyServiceImpl();
}
}
}
4、创建抽象工厂生产者,用来创建抽象工厂
public class FactoryProducer {
public static final String FACTORY_TYPE_BY_COMPANY = "FACTORY_TYPE_BY_COMPANY";
public static AbstractFactory getFactory(String type){
switch (type){
case FACTORY_TYPE_BY_COMPANY:
return new CompanyByTestFactory();
default:
return null;
}
}
}
5、测试抽象个工厂模式
@Test
public void testAbstractFun(){
//获取公司工厂
AbstractFactory factory = FactoryProducer.getFactory(FactoryProducer.FACTORY_TYPE_BY_COMPANY);
//获取公司对象
CompanyService company = factory.getCompany(CompanyByTestFactory.BEIJING_COMPANY);
//招聘员工
company.employUsers();
}
测试结果:
2022-08-09 11:02:01.726 ERROR 61832 — [main]
p.i.t.s.impl.BeijingCompanyServiceImpl : this is a beijing company employ



