本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
成都創(chuàng)新互聯(lián)專(zhuān)注于八宿網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供八宿營(yíng)銷(xiāo)型網(wǎng)站建設(shè),八宿網(wǎng)站制作、八宿網(wǎng)頁(yè)設(shè)計(jì)、八宿網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造八宿網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供八宿網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
汽車(chē)生產(chǎn)根據(jù)用戶選擇的汽車(chē)類(lèi)型,指定不同的工廠進(jìn)行生產(chǎn),選擇紅旗轎車(chē),就要使用中國(guó)工廠,選擇奧迪轎車(chē),就要使用德國(guó)工廠。
1) 抽象工廠模式:定義了一個(gè)interface用于創(chuàng)建相關(guān)對(duì)象或相互依賴的對(duì)象,而無(wú)需指明具體的類(lèi);
2) 抽象工廠模式可以將簡(jiǎn)單工廠模式和工廠方法模式進(jìn)行整合;
3) 從設(shè)計(jì)層面看,抽象工廠模式就是對(duì)簡(jiǎn)單工廠模式的改進(jìn)(或者稱為進(jìn)一步的抽象)。
4) 將工廠抽象成兩層,AbstractFactory(抽象工廠) 和 具體實(shí)現(xiàn)的工廠子類(lèi),方便程序擴(kuò)展。
/**
* 抽象工廠模式
*/
public class C01_AbstractFactory {
public static void main(String[] args) {
CarProductFactory factory = new ChinaCarFactory() ;
factory.getCar("hq") ;
factory = new GermanyCarFactory () ;
factory.getCar("ad") ;
}
}
// 汽車(chē)生產(chǎn)抽象工廠
interface CarProductFactory {
CarProduct getCar (String type) ;
}
// 中國(guó)汽車(chē)工廠
class ChinaCarFactory implements CarProductFactory {
@Override
public CarProduct getCar(String type) {
CarProduct product = null ;
if ("hq".equals(type)){
product = new HQCar() ;
product.name="紅旗一號(hào)" ;
product.date="1999-09-19" ;
product.material();
product.origin();
} else if ("df".equals(type)){
product = new DFCar() ;
product.name="東風(fēng)一號(hào)" ;
product.date="2019-09-19" ;
product.material();
product.origin();
}
return product ;
}
}
// 德國(guó)汽車(chē)工廠
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 ;
}
}
// 汽車(chē)生產(chǎn)抽象類(lèi)
abstract class CarProduct {
/**
* 汽車(chē)名稱
*/
protected String name ;
/**
* 生產(chǎn)日期
*/
protected String date ;
/**
* 材料
*/
abstract void material () ;
/**
* 產(chǎn)地
*/
abstract void origin () ;
}
// 紅旗車(chē)
class HQCar extends CarProduct {
@Override
void material() {
System.out.println(super.name+"材料...");
}
@Override
void origin() {
System.out.println(super.date+":"+super.name+"在中國(guó)北京生產(chǎn)");
}
}
// 東風(fēng)車(chē)
class DFCar extends CarProduct {
@Override
void material() {
System.out.println(super.name+"材料...");
}
@Override
void origin() {
System.out.println(super.date+":"+super.name+"在中國(guó)南京生產(chǎn)");
}
}
// 奧迪車(chē)
class ADCar extends CarProduct {
@Override
void material() {
System.out.println(super.name+"材料...");
}
@Override
void origin() {
System.out.println(super.date+":"+super.name+"在德國(guó)柏林生產(chǎn)");
}
}
// 寶馬車(chē)
class BMCar extends CarProduct {
@Override
void material() {
System.out.println(super.name+"材料...");
}
@Override
void origin() {
System.out.println(super.date+":"+super.name+"在德國(guó)慕尼黑生產(chǎn)");
}
}
Spring框架中獲取配置文件中Bean的多種方式。
這里使用了兩種方式獲取。
@RunWith(SpringJUnit4Cla***unner.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());
}
}
抽象工廠封裝對(duì)象的創(chuàng)建。在Spring中,通過(guò)實(shí)現(xiàn)BeanFactory。可以從Spring的各種容器獲取bean。根據(jù)Bean的配置,getBean方法可以返回不同類(lèi)型的對(duì)象(單例作用域)或初始化新的對(duì)象(原型作用域)。在BeanFactory的實(shí)現(xiàn)中,我們可以區(qū)分:ClassPathXmlApplicationContext,XmlWebApplicationContext等。
三種工廠模式 (簡(jiǎn)單工廠模式、工廠方法模式、抽象工廠模式),工廠模式的核心用意將實(shí)例化對(duì)象的代碼封裝起來(lái),放到工廠類(lèi)中統(tǒng)一管理和維護(hù),完成代碼依賴關(guān)系的解耦。從而提高程序的可擴(kuò)展性和維護(hù)性。
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent