设计模式之:工厂模式
来源:互联网 发布:淘宝客服需要会什么 编辑:程序博客网 时间:2024/06/05 14:56
工厂模式
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
情景模拟+代码实现
现在有两款汽车分别是奔驰,宝马。称之为“产品”:
abstract class Car { public Car() { }}public class BenzCar extends Car { public BenzCar() { System.out.println("奔驰汽车!"); }}public class BMWCar extends Car { public BMWCar() { System.out.println("宝马汽车!"); }}
有了产品当然需要客户了。
1.无工厂模式
现在有“客户”需要使用汽车,但是没有工厂怎么办?
没办法,只能自己动手,丰衣足食。
public class Main { public static void main(String[] args) { Car car1 = new BenzCar();//制造奔驰汽车 Car car2 = new BMWCar();//制造宝马汽车 }}
用户需要什么汽车,只需要new一下,然后自己制造就行了。(当然我们不用管他是怎么制造汽车的)
没有工厂时代的客户真的惨,需要什么汽车还要自己制造。~.~
2.简单工厂模式(Simple Factory)
然后有人发现制造汽车有利可图,建立了汽车工厂,生产汽车。然后向客户宣布:“你们给我下订单,你给我钱,我帮你们制造想要的汽车”!
public class SimpleFactory { /** * 1.生产奔驰汽车 2.生产宝马汽车 * * @return */ public Car create(int type) { switch (type) { case 1: return new BenzCar(); case 2: return new BMWCar(); default: break; } return null; }}
客户喜闻乐见,这下买汽车可方便多了。只需要找到工厂下订单就行。
public class Main { public static void main(String[] args) { SimpleFactory factory = new SimpleFactory();//找到工厂 factory.create(1);//下订单制造奔驰汽车 factory.create(2);//下订单制造宝马汽车 }}
3.工厂方法模式(Factory Method)
汽车给人们带来极大的便利,然后汽车的需求量越来越大,汽车的类型也越来越多。
一个工厂无法制造多种类型的汽车,也已经无法满足当前的需求量了怎么办?
开“分厂”,每个分厂制造只制造一种汽车,大大提升了效率!
interface Factory { Car create();}//奔驰厂public class BenzFactory implements Factory { @Override public Car create() { return new BenzCar(); }}//宝马厂public class BMWFactory implements Factory { @Override public Car create() { return new BMWCar(); }}
需要奔驰车的去奔驰厂,需要宝马车的去宝马厂。
public class Main { public static void main(String[] args) { Factory factory = new BenzFactory(); factory.create(); Factory factory1 = new BMWFactory(); factory1.create(); }}
4.抽象工厂模式(Abstract Factory)
时代在进步,汽车制造也要进步。现在汽车需要装空调了!
但是空调也有两个品牌:海尔,美的。
public interface Aircondition {}public class HaierAircondition implements Aircondition { public HaierAircondition(){ System.out.println("+装配海尔空调!"); }}public class MeiderAircondition implements Aircondition{ public MeiderAircondition() { System.out.println("+装配美的空调!"); }}
奔驰车装海尔空调,宝马汽车装美的空调!
工厂升级为可装空调的厂!
public interface AbstractFactory { Car car(); Aircondition aircondition();}public class BenzHaierFactory implements AbstractFactory { @Override public Car car() { return new BenzCar(); } @Override public Aircondition aircondition() { return new HaierAircondition(); }}public class BMWMeiderFactory implements AbstractFactory { @Override public Car car() { return new BMWCar(); } @Override public Aircondition aircondition() { return new MeiderAircondition(); }}
然而并不是每个客户都买的起空调车:
public class Main { public static void main(String[] args) { AbstractFactory factory = new BenzHaierFactory(); factory.car();//购买奔驰汽车 factory.aircondition();//带空调的 AbstractFactory factory1 = new BMWMeiderFactory(); factory1.car();//购买宝马汽车 factory1.aircondition();//待美的空调的 AbstractFactory factory2= new BMWMeiderFactory(); factory2.car();//购买宝马汽车 //factory1.aircondition();//不需要空调的 }}
5.比较:
工厂方法模式:
- 一个抽象产品类,可以派生出多个具体产品类。
- 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
- 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类可以创建多个具体产品类的实例。
区别:
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
总结
- 传统的无工厂模式下,客户调用方法(购买汽车),就必须知道方法的内部实现细节(汽车的制造工艺)。这对客户来说无疑是痛苦的。
- 而在简单工厂模式下,客户调用方法(购买汽车),只需要告诉方法类(工厂)自己需要哪种方法(汽车),无需知道方法的内部实现细节(汽车的制造工艺)。
- 工厂方法模式下,客户只需要找到相应的类(工厂),就能调用相应的方法(购买汽车),极大的方便了客户,提高了效率。然而其需要的类(工厂)根据需求是不断增加的,对应前期的代码投入(工厂投资,建厂)消耗是很大的,并不是完美的。
- 抽象工厂模式下,一个类运行有多个方法了(工厂可以同时汽车和空调),我们可以随意调用类中有关联的方法(汽车是否有空调)。虽然看似与工厂方法类似,但是其实现细节与内存还是有很大差异的。
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。
工厂方法模式是继承自一个抽象类,子类去实现某一个工厂方法,将对象生产延迟到子类中。而抽象工厂模式,一般是实现一个抽象工厂的接口,由具体的工厂去实现相应的接口,可以这样说吧,抽象工厂模式是包含工厂方法模式的。
代码下载
本文设计的Java代码:
http://download.csdn.net/download/demonliuhui/9957341
参考:
http://blog.csdn.net/lemon_tree12138/article/details/46225213
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之---工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之-工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之 ------工厂模式
- 设计模式之工厂模式
- 【太虚AR_v0.1】使用教程 | 云识别(图像识别)
- 密码验证合格程序
- C/C++中计算程序运行时间
- Laravel 快速入门 ( 一 ) composer 介绍以及安装
- monkey测试
- 设计模式之:工厂模式
- 网页 报错 200 404 400 401 错误
- 新闻详情页查看大图列表以及保存图片
- keras学习笔记---keras安装出现的问题
- Hadoop: HDFS数据流分析
- Docker 初实践手札
- 一分钟了解"英语表达:时域上是相关or不相关的,频域上是高频or低频的"
- Maven项目集成cxf框架发布WebService
- POJ2318 TOYS(叉积,计算几何)