Java工厂模式
来源:互联网 发布:人工智能不会取代人类 编辑:程序博客网 时间:2024/06/18 10:35
为什么要使用工厂?
考虑现实的一种情况,如果我们需要一件上衣,我们可以自己做,也可以去订做,如果要自己做,自己必须了解做衣服的所有细节,如果订做,只要告诉他们我们要什么样的就行了,我们不知道做的一切细节。在开发软件的时候也一样,如果我们需要一个对象,我们可以自己new一个,我们自己new的话,对象和客户端必须紧密耦合。如果我们用一个工厂类来实例化所需要的对象,我们就只告诉我们要什么就行了。
工厂模式可以分为:
- 简单工厂
- 工厂方法
- 抽象工厂
简单工厂:一个工厂可以实例化实现抽象接口的所有产品
package cn.true123;interface Water {}class SpringWater implements Water {}class CocaWater implements Water {}public class WaterFactory { public Water getWater(String type) { switch (type) { case "s": return new SpringWater(); case "c": return new CocaWater(); default: return null; } }}class Client{ public static void main(String[] args) { WaterFactory factory = new WaterFactory(); Water springWater = factory.getWater("s"); Water cocaWater = factory.getWater("c"); }}
如果要添加新的产品,需要得修改factory
,这就违背了open-close规则。
工厂方法:一个抽象工厂,有多个具体工厂, 一个抽象产品,有许多具体的产品,每个具体工厂来生产具体产品。
package cn.true123;interface Water {}class SpringWater implements Water {}class CocaWater implements Water {}interface IFactory{ Water produceWater();}class SpringWaterFactory implements IFactory{ @Override public Water produceWater() { // TODO Auto-generated method stub return new SpringWater(); }}class CocaWaterFactory implements IFactory{ @Override public Water produceWater() { // TODO Auto-generated method stub return new CocaWater(); }}public class Client{ public static void main(String[] args) { IFactory factory = new SpringWaterFactory(); Water springWater = factory.produceWater(); IFactory cocaFactory = new CocaWaterFactory(); Water cocaWater = factory.produceWater(); }}
如果需要另外一种水,我们可以扩展抽象工厂和抽象产品,这样程序就对修改关闭,对扩展开放了。
工厂方式适用于一个工厂生产一种产品,如果有多类产品,每个工厂可以生产多累产品,这时候要用到抽象工厂。
package cn.true123;interface Water {}class SpringWater implements Water {}class CocaWater implements Water {}interface Bottle{}class SpringWaterBottle implements Bottle{}class CocaWaterBottle implements Bottle{}interface IFactory{ Water produceWater(); Bottle produceBottle();}class SpringWaterFactory implements IFactory{ @Override public Water produceWater() { // TODO Auto-generated method stub return new SpringWater(); } @Override public Bottle produceBottle() { // TODO Auto-generated method stub return new SpringWaterBottle(); }}class CocaWaterFactory implements IFactory{ @Override public Water produceWater() { // TODO Auto-generated method stub return new CocaWater(); } @Override public Bottle produceBottle() { // TODO Auto-generated method stub return new CocaWaterBottle(); }}public class Client{ public static void main(String[] args) { IFactory factory = new SpringWaterFactory(); Water springWater = factory.produceWater(); Bottle springWaterBottle = factory.produceBottle(); IFactory cocaFactory = new CocaWaterFactory(); Water cocaWater = factory.produceWater(); Bottle cocaWaterBottle= factory.produceBottle(); }}
可见抽象工厂应该属于工厂方法的升级,但是抽象工厂使得的工厂的属性大大增加,必须有2中产品,每种有5个具体产品,如果要全组合,就跌需要5*5=25个工厂,增加了维护成本。
阅读全文
0 0
- java工厂模式-简单工厂,工厂方法,抽象工厂模式
- Java工厂模式之简单工厂模式
- java中的工厂模式(简单工厂模式+工厂方法模式)
- 工厂模式(工厂方法模式,抽象工厂模式) Java
- java的工厂模式
- java工厂模式
- java工厂模式
- java 设计工厂模式
- Java 工厂模式设计
- Java工厂模式
- Java工厂模式
- Java工厂模式
- JAVA工厂模式详解
- java 工厂模式
- Java工厂模式
- java抽象工厂模式
- Java的工厂模式
- java主题:工厂模式
- Java 线程异常处理
- Java 中Redirect和Forward
- MVC,MVP 和 MVVM架构
- 数据倾斜是多么痛?spark作业调优秘籍
- Choose and divide唯一分解定理/分解/直接 UVA
- Java工厂模式
- 网络安全传输系统(5)-账号管理系统
- ELK学习3_使用redis+logstash+elasticsearch+kibana快速搭建日志平台
- python3中模块详解--time模块
- Spring三种配置注入方式
- 2017 iOS 开发 33 款主宰的开源库
- Codeforces Gym 101142 G. Gangsters in Central City (最近公共祖先)
- AndroidStudio 设置内存大小
- play框架的使用