天镇| 曲松| 洪泽| 盘锦| 阳原| 称多| 宁津| 云林| 金口河| 渭源| 庐江| 杜集| 襄阳| 九江县| 东莞| 太和| 东西湖| 沾化| 正阳| 建宁| 清原| 邵武| 通化县| 杜集| 达县| 峨山| 西宁| 托克逊| 申扎| 喀喇沁左翼| 垦利| 清远| 边坝| 邵武| 斗门| 德江| 靖远| 普兰| 襄樊| 壤塘| 开封县| 吉安县| 建阳| 广河| 湘阴| 华山| 永清| 南江| 巴东| 利川| 汨罗| 台前| 万荣| 汤阴| 彭州| 建平| 富平| 遵义县| 邯郸| 安岳| 西昌| 曲江| 错那| 萨嘎| 玉门| 峨山| 金湖| 邱县| 洮南| 阜康| 灵武| 会泽| 建水| 伽师| 昭苏| 滕州| 龙游| 巨鹿| 曹县| 桐梓| 丰镇| 田阳| 东明| 隆尧| 藤县| 徐州| 成武| 丁青| 呼兰| 金山屯| 乡城| 茄子河| 万载| 屏南| 武山| 理塘| 友好| 浚县| 上虞| 盐津| 措美| 融安| 平遥| 土默特左旗| 顺德| 同安| 通州| 犍为| 靖州| 和布克塞尔| 六盘水| 绩溪| 丰宁| 双鸭山| 旅顺口| 台山| 扎囊| 丰润| 嘉兴| 泗洪| 上饶县| 祥云| 松江| 天水| 南昌市| 普兰| 福鼎| 雁山| 靖安| 太白| 布拖| 呼兰| 民乐| 琼海| 巫山| 宝坻| 余庆| 东平| 巩义| 城步| 西青| 石狮| 潘集| 甘泉| 西和| 禄丰| 修水| 江门| 寿县| 巴彦淖尔| 曲阳| 从江| 合阳| 皋兰| 岱岳| 汾阳| 布拖| 扎囊| 无棣| 罗田| 定安| 宜州| 宽城| 涿州| 绥芬河| 黄埔| 青州| 威宁| 五寨| 宜春| 新沂| 锡林浩特| 敖汉旗| 增城| 镇巴| 田阳| 乐都| 辰溪| 栾城| 阳东| 格尔木| 潼关| 紫阳| 湖口| 南沙岛| 印江| 敦煌| 方山| 二连浩特| 莱西| 加格达奇| 来安| 红岗| 汤旺河| 迁西| 鄂伦春自治旗| 大田| 墨玉| 梓潼| 恭城| 孙吴| 郧西| 玉树| 东乡| 藁城| 丰顺| 公主岭| 怀远| 改则| 独山子| 彰化| 科尔沁右翼中旗| 卢氏| 印江| 景德镇| 东阿| 沁源| 昭平| 恩平| 贡嘎| 宽城| 龙陵| 西和| 泗县| 晴隆| 江阴| 柏乡| 祁连| 江西| 右玉| 鸡西| 盐津| 海门| 兴和| 华蓥| 喀什| 南昌市| 虞城| 封丘| 刚察| 钓鱼岛| 定安| 阳谷| 平川| 赣州| 苏尼特左旗| 托里| 加格达奇| 长兴| 兰溪| 太康| 伊金霍洛旗| 陆河| 泸州| 石楼| 新宾| 新余| 石棉| 濮阳| 辽中| 城步| 五营| 昭觉| 多伦| 电脑下注赌场
|
|
51CTO旗下网站
|
|
移动端

深入理解Java的三种工厂模式

提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。

作者:编辑之路来源:开源中国|2019-01-19 10:20

 

一、简单工厂模式

简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类

实现汽车接口

  1. public interface Car {  
  2.     String getName();  

奔驰类

  1. public class Benz implements Car {  
  2.     @Override  
  3.     public String getName() {  
  4.         return "Benz";  
  5.     }  

宝马类

  1. public class BMW implements Car {  
  2.     @Override  
  3.     public String getName() {  
  4.         return "BMW";  
  5.     }  

简单工厂,既能生产宝马又能生产奔驰

  1. public class SimpleFactory {  
  2.     public Car getCar(String name){  
  3.         if (name.equals("BMW")){  
  4.             return new BMW();  
  5.         }else if (name.equals("benz")){  
  6.             return new Benz();  
  7.         }else {  
  8.             System.out.println("不好意思,这个品牌的汽车生产不了");  
  9.             return null;  
  10.         }  
  11.     }  

测试类

  1. public class SimpleFactoryTest {  
  2.     public static void main(String[] args){  
  3.         SimpleFactory simpleFactory = new SimpleFactory();  
  4.         Car car = simpleFactory.getCar("BMW");  
  5.         System.out.println(car.getName());  
  6.     }  

测试结果

  1. BMW 

根据简单工厂的定义,用户只要产品而不在乎产品如何生产,看起来好像很完美的样子。但大家想想,这个世界存在什么都生产的工厂吗?

显然是不存在的,每一个汽车品牌都有自己的生产工厂,都有自己生产技术。映射到spring框架中,我们有很多很多种的bean需要生产,如果只依靠一个简单工厂来实现,那么我们得在工厂类中嵌套多少个if..else if啊?

而且我们在代码中生产一辆汽车只是new一下就出来了,但实际操作中却不知道需要进行多少操作,加载、注册等操作都将体现在工厂类中,那么这个类就会变得紊乱,管理起来也很不方便,所以说每个品牌应该有自己的生产类。

因为专一,所以专业嘛,这个时候工厂方法就出现了。

二、工厂方法

工厂接口

  1. //定义一个工厂接口,功能就是生产汽车  
  2. public interface Factory {  
  3.     Car getCar();  

奔驰工厂

  1. public class BenzFactory implements Factory {  
  2.     @Override  
  3.     public Car getCar() {  
  4.         return new Benz();  
  5.     }  

宝马工厂

  1. public class BMWFactory implements Factory{  
  2.     @Override  
  3.     public Car getCar() {  
  4.         return new BMW();  
  5.     }  

测试类

  1. public class FactoryTest {  
  2.    public static void main(String[] args){  
  3.        Factory bmwFactory = new BMWFactory();  
  4.        System.out.println(bmwFactory.getCar().getName());  
  5.        Factory benzFactory = new BenzFactory();  
  6.        System.out.println(benzFactory.getCar().getName());  
  7.    }  

测试结果

  1. BMW  
  2. Benz 

根据上述代码可以看出,不同品牌的汽车是由不同的工厂生产的,貌似又是很完美的。但大家看一下测试类,当一个人想要去买一辆宝马汽车的时候(假设没有销售商),那么他就要去找宝马工厂给他生产一辆,过几天又想要买一辆奔驰汽车的时候,又得跑到奔驰工厂请人生产,这无疑就增加了用户的操作复杂性。所以有没有一种方便用户操作的方法呢?这个时候抽象工厂模式就出现了。

三、抽象工厂

 抽象工厂

  1. public abstract class AbstractFactory {  
  2.      protected abstract Car getCar();    
  3.      //这段代码就是动态配置的功能  
  4.      //固定模式的委派  
  5.      public Car getCar(String name){  
  6.         if("BMW".equalsIgnoreCase(name)){  
  7.             return new BmwFactory().getCar();  
  8.         }else if("Benz".equalsIgnoreCase(name)){  
  9.             return new BenzFactory().getCar();  
  10.         }else if("Audi".equalsIgnoreCase(name)){  
  11.             return new AudiFactory().getCar();  
  12.         }else{  
  13.             System.out.println("这个产品产不出来");  
  14.             return null;  
  15.         }  
  16.     }  

默认工厂

  1. public class DefaultFactory extends AbstractFactory {  
  2.     private AudiFactory defaultFactory = new AudiFactory();    
  3.     public Car getCar() {  
  4.         return defaultFactory.getCar();  
  5.     } 

宝马工厂

  1. public class BMWFactory extends AbstractFactory {  
  2.     @Override  
  3.     public Car getCar() {  
  4.         return new BMW();  
  5.     }  

奔驰工厂

  1. public class BenzFactory extends AbstractFactory {  
  2.     @Override  
  3.     public Car getCar() {  
  4.         return new Benz();  
  5.     }  

 测试类

  1. public class AbstractFactoryTest {  
  2.     public static void main(String[] args) {    
  3.         DefaultFactory factory = new DefaultFactory();    
  4.         在此我向大家推荐一个架构学习交流圈:830478757  
  5.         System.out.println(factory.getCar("Benz").getName());  
  6.  
  7.     }  

测试结果

  1. Benz 

根据上述代码可以看出,用户需要一辆汽车,只需要去找默认的工厂提出自己的需求(传入参数),便能得到自己想要产品,而不用根据产品去寻找不同的生产工厂,方便用户操作。

注:对于设计模式,有些人嗤之以鼻,有些人敬若神明,但我是认可的。

按我粗浅的理解,设计模式的经典之处,就在于解决了编写代码的人和调用代码的人双方的痛楚,不同的设计模式也只适用于不同的场景。至于用或者不用,如何使用,那就需要各位看官着重考虑了。

但为了使用而使用是不应该的,细微之处,只有留给大家慢慢品味了。

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

鸟哥的Linux私房菜 基础学习篇(第二版)

本书全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linu...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
徐家麦岛 南口地区 岩东乡 东王佐 马家埠
西文昌阁 诚品建筑社区 康定里 天元吉第 百马乡
番摊游戏 澳门葡京娱乐官网 真钱牛牛游戏 电子游艺 真钱捕鱼游戏
葡京投注网 澳门真人游戏赌场 电子游戏机 澳门至尊赌场网址 永利娱乐
葡京网上娱乐 葡京国际 澳门威尼斯人注册官网 地下赌场游戏 轮盘游戏网址
电子游艺 澳门百家乐代理 双重王牌2 电子游戏厅 浪人武士
老虎机定位器 澳门大富豪网址 现金三公注册网址 牛牛游戏下载 现金骰宝 年度十大电子游戏 大小点游戏 玩什么游戏可以挣钱 电子游戏厅 方法奇葩赌博网 巴黎人网站 pt电子游戏哪个最会爆 澳门巴黎人游戏 澳门龙虎斗注册 澳门大富豪网站 押大小排行 真钱打牌 明升网站 十三水技巧 电子游戏下载 二十一点平台 现金网游戏开户平台 澳门百老汇游戏官网 皇博压大小 真钱捕鱼 跑马机游戏 赌博技巧 巴比伦赌场官网 现金三公 地下网址 捕鱼游戏技巧 英皇网站 手机玩游戏赚钱平台 现金网排行 pt电子游戏注册 赌博技巧 电脑玩游戏赚钱平台 海立方游戏 ag电子游戏排行 希尔顿官网 太阳网上压大小 现金赌钱游戏 现金棋牌游戏 真人网站网址 地下开户 九五至尊娱乐网址 澳门梭哈游戏官网 奇葩袖赌博网 鸿胜国际压大小 博狗扑克游戏 德州扑克游戏规则 庄闲代理 奔驰宝马老虎机下载 现金三公开户注册 免费试玩电子游戏 GT压大小 新濠天地注册 现金老虎机网站 纸牌赌博种类 乐天堂开户 澳门永利平台 电脑版捕鱼达人 玩电子游戏入门 斗牛游戏 bbin压大小 网上电子游戏网址 澳门网络下注平台 明升国际网址 明升娱乐 捕鱼达人电子游戏 mg电子游戏试玩 二十一点游戏赌场 澳门万利赌场官网 大小对比网站 现金电子游戏 电子游戏实用技术 老虎机破解器 澳门梭哈官网 澳门百老汇赌场注册 千炮捕鱼兑换现金 网上合法赌场 PT电子游戏 波克棋牌官方下载 天天棋牌 凤凰棋牌 美少女战士电子游戏 什么游戏可以赚人民币 银河国际娱乐 澳门番摊官网 澳门梭哈官网 胜博发电子游戏 电子游戏打鱼机 澳门现金网 大三巴网站 PT电子游戏 澳门银河国际娱乐