设计模式:工厂方法与抽象工厂模式
说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别。 原文链接:http://blog.csdn.net/yzxz/article/details/4601152
抽象工厂模式与工厂方法模式区别
工厂方法UML图:
抽象工厂UML图:
---------------------------------
对于java来说,你能见到的大部分抽象工厂模式都是这样的:
它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。
比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。
这样A和B就是工厂,对应于抽象工厂;
每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;
用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)
所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线
---------------------------------
“抽象工厂”模式依赖于“工厂方法”模式的。因此,抽象工厂强调的是前面的动词“抽象”,也就是说,你将工厂方法模式中的工厂方法抽象出来的那个"动作或设计"就是“抽象工程”模式了。
---------------------------------
factory method针对的是一个产品等级结构
abstract factory是面向多个产品等级结构的
---------------------------------
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
---------------------------------
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
具体例子:
1.简单工厂:
- package com.lucius.creational.patterns.simpleFactoryPattern;
- public interface Icar{
- void run();
- }
- public class BMWCar implements ICar{
- public void run(){
- System.out.println("BMWCar run!");
- }
- }
- public class BenzCar implements ICar{
- public void run(){
- System.out.println("BenzCar run!");
- }
- }
- public class Driver{
- public enum carType{
- BMW,
- Benz
- }
- public static ICar DriverCar(String carType){
- switch(carType){
- case BMW :
- return new BMWCar();
- case Benz :
- return new BenzCar();
- }
- }
- public class client{
- public static void main(String[] args){
- ICar myCar = Driver.DriverCar("Benz");
- myCar.run();
- }
- }
- }
心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类
2.工厂方法:
- package com.lucius.creational.patterns.factoryPattern;
- public interface ICar{
- public void run();
- }
- public class BMWCar implements ICar{
- public void run(){
- System.out.println("BMWCar run!");
- }
- }
- public class BenzCar implements ICar{
- public void run(){
- System.out.println("BenzCar run!");
- }
- }
- public interface IDriver{
- public Icar driverCar();
- }
- public class BMWCarDriver implements IDriver{
- public ICar driverCar(){
- return new BMWCar();
- }
- }
- public class BenzCarDriver implements IDriver{
- public ICar driverCar(){
- return new BenzCar();
- }
- }
- public class client{
- public static void main(String[] args){
- IDriver myDriver = new BenzCarDriver();
- Icar myCar = myDriver.driverCar();
- myCar.run();
- }
- }
心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.
3.抽象工厂:
- package com.lucius.creational.patterns.AbstractFactoryPattern;
- public interface IBusinessCar{
- public void run();
- }
- public interface ISportCar{
- public void run();
- }
- public class BMWBusinessCar implements IBusinessCar{
- public void run(){
- System.out.println("BMWBusinessCar run!");
- }
- }
- public class BenzBusinessCar implements IBusinessCar{
- public void run(){
- System.out.println("BenzBusinessCar run!");
- }
- }
- public class BMWSportCar implements ISportCar{
- public void run(){
- System.out.println("BMWSportCar run!");
- }
- }
- public class BenzSportCar implements ISportCar{
- public void run(){
- System.out.println("BenzSportCar run!");
- }
- }
- public interface IDriver{
- IBusinessCar BusinessCarDriver();
- ISportCar SportCarDriver();
- }
- public class BMWCarDriver implements IDriver{
- public IBusinessCar BusinessCarDriver(){
- return new BMWBusinessCar();
- }
- public ISportCar SportCarDriver(){
- return new BMWSportCar();
- }
- }
- public class BenzCarDriver implements IDriver{
- public BenzBusinessCar BusinessCarDriver(){
- return new BenzBusinessCar();
- }
- public BMWSportCar SportCarDriver(){
- return new BMWSportCar();
- }
- }
- public class client{
- public static void main(String[] args){
- IDriver myDriver = new BenzCarDriver();
- Icar myCar = myDriver.SportCarDriver();
- myCar.run();
- }
- }
心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.
PS. 我的设计模式系列blog,《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。
设计模式:工厂方法与抽象工厂模式相关推荐
- 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- 【设计模式实战】简单工厂、工厂方法、抽象工厂:原理篇
小明开发的应用,经常要从XML或者Asset中读取省市区数据. 小明是这样写的: public abstract class IOHandler {/*** 添加*/public abstract v ...
- 23招做项目——工厂模式:工厂方法和抽象工厂
在网上的大多数资料里面,将工厂模式分为:简单工厂.工厂方法.抽象工厂,他们之间的联系(以电子厂为例)如下: 那么该文章首先讲解工厂模式是什么,为什么需要工厂模式,最后再对三种模式进行示例.该文章是23 ...
- Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)
文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂) 一.简单工厂模式 引出简单工厂模式 二.工厂方法模式 三.抽象工厂模式 Android源码中用到的工厂模式举例 一.BitmapFactory ...
- 设计模式——简单工厂、工厂方法和抽象工厂的区别与联系
前言 创建型模式中,常用的有工厂方法模式和抽象工厂模式,平时实践还包括简单工厂模式,虽然简单工厂模式不在23种设计模式中. 为了区分以上几种设计模式的差别,通过以下几个例子介绍这几种模式的使用场景以及 ...
- java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...
- 每周一个设计模式之工厂方法与抽象工厂
工厂方法模式与抽象工厂模式,两个模式比较相似,把任何一个独立出来,好像都不太好,所以把它们放到一起来理解会更好.不管是工厂方法还是抽象工厂,都有三个要素,那就是Client,Factory,Produ ...
- 工厂模式(简单工厂,工厂方法,抽象工厂)
工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...
最新文章
- 《看透springmvc源码分析与实践》读书笔记二
- javaweb设置servlet
- 管线命令 cut grep
- PAT甲级1019 General Palindromic Number:[C++题解]进制位、回文数、vector来做
- ReentrantLock实现原理深入探究
- git的简单操作命令
- 直播预告 | 小米人工智能部崔世起:小爱同学全双工技术实践
- linux 中安装 JDK
- 【大会】声音叫醒耳朵,语音连接网络
- 怎么运行verilog语言_(六) Verilog入门之有限状态机
- php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
- html字数统计,html页面字数统计
- 北大美女辞去公司副总职务创业养狗
- php版本高无法删除栏目,phpcms不能删除栏目怎么办
- 提交百度快速收录真的能达到秒收录吗
- div+css三栏式布局
- 这是属于你我平凡人的荣耀
- 软件测试是干什么的 什么样的人才能够当软件测试员?
- 2012 CSP-S 初赛 答案解析
- Failed to connect to github.com port 443: Timed out 及 ping github.com请求超时