Java描述设计模式(04):抽象工厂模式
程序员文章站
2024-02-05 20:01:28
一、抽象工厂模式 1、生活场景 汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。 2、抽象工厂模式 1) 抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类; 2) 抽象工厂模式可以将 ......
一、抽象工厂模式
1、生活场景
汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。
2、抽象工厂模式
1) 抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类;
2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合;
3) 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
4) 将工厂抽象成两层,abstractfactory(抽象工厂) 和 具体实现的工厂子类,方便程序扩展。
3、代码uml图
4、源代码实现
/** * 抽象工厂模式 */ public class c01_abstractfactory { public static void main(string[] args) { carproductfactory factory = new chinacarfactory() ; factory.getcar("hq") ; factory = new germanycarfactory () ; factory.getcar("ad") ; } } // 汽车生产抽象工厂 interface carproductfactory { carproduct getcar (string type) ; } // 中国汽车工厂 class chinacarfactory implements carproductfactory { @override public carproduct getcar(string type) { carproduct product = null ; if ("hq".equals(type)){ product = new hqcar() ; product.name="红旗一号" ; product.date="1999-09-19" ; product.material(); product.origin(); } else if ("df".equals(type)){ product = new dfcar() ; product.name="东风一号" ; product.date="2019-09-19" ; product.material(); product.origin(); } return product ; } } // 德国汽车工厂 class germanycarfactory implements carproductfactory { @override public carproduct getcar(string type) { carproduct product = null ; if ("ad".equals(type)){ product = new adcar() ; product.name="奥迪a8" ; product.date="2017-09-19" ; product.material(); product.origin(); } else if ("bm".equals(type)){ product = new bmcar() ; product.name="宝马x8" ; product.date="2018-09-19" ; product.material(); product.origin(); } return product ; } } // 汽车生产抽象类 abstract class carproduct { /** * 汽车名称 */ protected string name ; /** * 生产日期 */ protected string date ; /** * 材料 */ abstract void material () ; /** * 产地 */ abstract void origin () ; } // 红旗车 class hqcar extends carproduct { @override void material() { system.out.println(super.name+"材料..."); } @override void origin() { system.out.println(super.date+":"+super.name+"在中国北京生产"); } } // 东风车 class dfcar extends carproduct { @override void material() { system.out.println(super.name+"材料..."); } @override void origin() { system.out.println(super.date+":"+super.name+"在中国南京生产"); } } // 奥迪车 class adcar extends carproduct { @override void material() { system.out.println(super.name+"材料..."); } @override void origin() { system.out.println(super.date+":"+super.name+"在德国柏林生产"); } } // 宝马车 class bmcar extends carproduct { @override void material() { system.out.println(super.name+"材料..."); } @override void origin() { system.out.println(super.date+":"+super.name+"在德国慕尼黑生产"); } }
二、spring框架应用
1、场景描述
spring框架中获取配置文件中bean的多种方式。
2、核心配置
<bean id="carbean" class="com.model.design.spring.node04.abstractfactory.carbean"> <property name="name" value="中国红旗" /> </bean> <bean id="carbean1" class="com.model.design.spring.node04.abstractfactory.carbean"> <property name="name" value="德国奥迪" /> </bean>
3、测试文件
这里使用了两种方式获取。
@runwith(springjunit4classrunner.class) @contextconfiguration(locations = {"classpath:/spring/spring-abstract-factory.xml"}) public class springtest { @resource private beanfactory beanfactory ; @test public void test01 (){ carbean carbean = (carbean)beanfactory.getbean("carbean") ; system.out.println(carbean.getname()); } @test public void test02 (){ applicationcontext context01 = new classpathxmlapplicationcontext( "/spring/spring-abstract-factory.xml"); carbean carbean = (carbean)context01.getbean("carbean1") ; system.out.println(carbean.getname()); } }
4、结构分析
抽象工厂封装对象的创建。在spring中,通过实现beanfactory。可以从spring的各种容器获取bean。根据bean的配置,getbean方法可以返回不同类型的对象(单例作用域)或初始化新的对象(原型作用域)。在beanfactory的实现中,我们可以区分:classpathxmlapplicationcontext,xmlwebapplicationcontext等。
三、工厂模式小结
三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式),工厂模式的核心用意将实例化对象的代码封装起来,放到工厂类中统一管理和维护,完成代码依赖关系的解耦。从而提高程序的可扩展性和维护性。
四、源代码地址
github地址:知了一笑 https://github.com/cicadasmile/model-arithmetic-parent 码云地址:知了一笑 https://gitee.com/cicadasmile/model-arithmetic-parent