Java設(shè)計(jì)模式筆記之抽象工廠代碼示例
上一篇說(shuō)到了工廠模式,那么學(xué)習(xí)了工廠模式,抽象工廠也得學(xué)習(xí)一下。實(shí)際上,抽象工廠模式實(shí)際上就是在工廠模式的基礎(chǔ)上再嵌套一層工廠模式而已,通過(guò)父工廠制造子工廠。只是,也并不完全是嵌套一層,各個(gè)工廠會(huì)被抽象成一個(gè)集多個(gè)工廠共同點(diǎn)的抽象類。通過(guò)工廠制造器,創(chuàng)建出該抽象工廠的子類。
好比如說(shuō),一個(gè)博客頁(yè)面有個(gè)換膚系統(tǒng)。那么假如有兩套風(fēng)格,黑和白。那么,我選擇了黑色風(fēng)格的,實(shí)際這步就相當(dāng)通過(guò)換膚系統(tǒng)這個(gè)工廠制造器,創(chuàng)建出一個(gè)黑色主題的工廠,該黑色主題的工廠內(nèi)可以生產(chǎn)各種黑色風(fēng)格的產(chǎn)品,比如黑色頭像掛飾,黑色背景,黑色的xxx等,然后通過(guò)這些黑色主題產(chǎn)品完成了整個(gè)換膚操作。白色主題也如此。
好吧,上次以水果工廠作為一個(gè)類,那么這次要?jiǎng)?chuàng)建一個(gè)蔬菜工廠,水果和蔬菜這兩類都屬于種植物,那么我們就可以根據(jù)這一共同點(diǎn)抽象出一個(gè)種植物抽象類,即種植物工廠。
首先,創(chuàng)建產(chǎn)品類,包括上次的水果,和現(xiàn)在的蔬菜,他們都實(shí)現(xiàn)了水果類接口和蔬菜類接口:
水果系列:
public interface Fruit {
void printInfo();
}
public class Apple implements Fruit{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("蘋果");
}
}
public class Banana implements Fruit{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("香蕉");
}
}
public class Orange implements Fruit{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("橙子");
}
}
接著是蔬菜系列:
public interface Vegetable {
public void printInfo();
}
public class Tomato implements Vegetable{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("西紅柿");
}
}
public class Cabbage implements Vegetable{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("白菜");
}
}
public class Eggplant implements Vegetable{
@Override
public void printInfo() {
// TODO Auto-generated method stub
System.out.println("茄子");
}
}
然后,是它們各自的工廠類:
水果工廠:
public class FruitFactory extends PlantFactory{
public static final int APPLE=1;
public static final int BANANA=2;
public static final int ORANGE=3;
@Override
public Fruit getFruit(int fruitType){
if(fruitType==APPLE){
return new Apple();
}
if(fruitType==BANANA){
return new Banana();
}
if(fruitType==ORANGE){
return new Orange();
}
return null;
}
@Override
Vegetable getVegetable(int vegetableType) {
// TODO Auto-generated method stub
return null;
}
}
蔬菜工廠:
public class VegetableFactory extends PlantFactory {
public static final int CABBAGE=1;
public static final int TOMATO=2;
public static final int EGGPLANT=3;
@Override
Fruit getFruit(int fruitType) {
// TODO Auto-generated method stub
return null;
}
@Override
public Vegetable getVegetable(int vegetableType) {
// TODO Auto-generated method stub
if(vegetableType==CABBAGE){
return new Cabbage();
}
if(vegetableType==TOMATO){
return new Tomato();
}
if(vegetableType==EGGPLANT){
return new Eggplant();
}
return null;
}
}
可以看到,它們都是屬于種植物這一類,所以都是繼承了種植工廠類
public abstract class PlantFactory {
abstract Fruit getFruit(int fruitType);
abstract Vegetable getVegetable(int vegetableType);
}
最后,提供一個(gè)工廠生產(chǎn)器,即生產(chǎn)工廠的工廠:
public class Plantation {
public static final int FRUIT=1;
public static final int VEGETABLE=2;
public static PlantFactory getFactory(int factoryType){
if(factoryType==FRUIT){
return new FruitFactory();
}
if(factoryType==VEGETABLE){
return new VegetableFactory();
}
return null;
}
}
好吧,寫個(gè)main測(cè)試下:
public static void main(String[] args) {
// TODO Auto-generated method stub
FruitFactory fruitFactory=(FruitFactory)Plantation.getFactory(Plantation.FRUIT);
Apple apple=(Apple) fruitFactory.getFruit(FruitFactory.APPLE);
apple.printInfo();
VegetableFactory vegetableFactory=(VegetableFactory)Plantation.getFactory(Plantation.VEGETABLE);
Tomato tomato=(Tomato) vegetableFactory.getVegetable(VegetableFactory.TOMATO);
tomato.printInfo();
}
結(jié)果:
蘋果 西紅柿
雖然工廠設(shè)計(jì)模式在獲取產(chǎn)品類時(shí)很方便,但實(shí)際上產(chǎn)品的需求越嚴(yán)格,那么內(nèi)部系統(tǒng)則越發(fā)龐大復(fù)雜,對(duì)于生產(chǎn)一些小產(chǎn)品來(lái)說(shuō),使用這么復(fù)雜龐大的系統(tǒng)反而浪費(fèi)資源。
總結(jié)
以上就是本文關(guān)于Java設(shè)計(jì)模式筆記之抽象工廠代碼示例的全部?jī)?nèi)容。代碼是一個(gè)人主觀意志的客觀反映。。。胡扯了,參考別人寫的代碼,另外,多看看源碼也是有好處的,學(xué)習(xí)別人實(shí)現(xiàn)某個(gè)功能的設(shè)計(jì)思路,來(lái)提高自己的編程水平。歡迎參閱:Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解、Java單例模式實(shí)現(xiàn)靜態(tài)內(nèi)部類方法示例等,有什么問(wèn)題可以隨時(shí)留言,歡迎大家交流討論。
- Java創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)
- Java設(shè)計(jì)模式之抽象工廠模式淺析講解
- Java設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)
- Java?深入理解創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式
- 深入理解Java設(shè)計(jì)模式之抽象工廠模式
- Java設(shè)計(jì)模式之簡(jiǎn)單工廠 工廠方法 抽象工廠深度總結(jié)
- Java設(shè)計(jì)模式之抽象工廠模式詳解
- Java設(shè)計(jì)模式之工廠模式分析【簡(jiǎn)單工廠、工廠方法、抽象工廠】
- Java設(shè)計(jì)模式之抽象工廠模式
- Java設(shè)計(jì)模式之抽象工廠模式實(shí)例詳解
- Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠與抽象工廠模式的使用實(shí)例
- Java設(shè)計(jì)模式編程中的工廠方法模式和抽象工廠模式
- Java設(shè)計(jì)模式之工廠方法和抽象工廠
相關(guān)文章
Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析
這篇文章主要介紹了Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析,在 Java 中,我們使用 JVM 進(jìn)行線程調(diào)度,所以一般來(lái)說(shuō),線程的調(diào)度有兩種模式:分時(shí)調(diào)度和搶占式調(diào)度,線程和進(jìn)程在阻塞或者等待時(shí),都不會(huì)使用 CPU 資源,需要的朋友可以參考下2024-01-01
SpringBoot集成Druid連接池進(jìn)行SQL監(jiān)控的問(wèn)題解析
這篇文章主要介紹了SpringBoot集成Druid連接池進(jìn)行SQL監(jiān)控的問(wèn)題解析,在SpringBoot工程中引入Druid連接池非常簡(jiǎn)單,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
關(guān)于SpringMVC請(qǐng)求域?qū)ο蟮臄?shù)據(jù)共享問(wèn)題
這篇文章主要介紹了SpringMVC請(qǐng)求域?qū)ο蟮臄?shù)據(jù)共享問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
MyBatis/mybatis-plus項(xiàng)目打印SQL的方法實(shí)現(xiàn)
SpringBoot項(xiàng)目中,經(jīng)常需要打印SQL語(yǔ)句及其參數(shù),本文就來(lái)介紹一下MyBatis/mybatis-plus項(xiàng)目打印SQL的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
git stash 和unstash的使用操作,git unstash failed
這篇文章主要介紹了git stash 和unstash的使用操作,git unstash failed,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java最簡(jiǎn)單的DES加密算法實(shí)現(xiàn)案例
下面小編就為大家?guī)?lái)一篇Java最簡(jiǎn)單的DES加密算法實(shí)現(xiàn)案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06

