文档章节

简单工厂,工厂方法,抽象工厂的区别

西门向东
 西门向东
发布于 2015/08/06 22:56
字数 922
阅读 29
收藏 0

简单工厂,是负责对象的创建,将对象的创建放在一个方法里面  很多时候 就使用一个静态的方法来创建对象,这样可以不用使用创建对象方法来实例化,直接使用类名来调用,但是这样就不能通过继承来改变工厂的创造行为。    把对象抽出来创造的意义在于 工厂可能会被用的很多地方,如上面的例子不仅仅是手机店,还有可能使用的手机单据里面.

  看代码 SampleFactory  里面还是要传入 一个 手机品牌来具体的new ,但是如果手机品牌多了,那代码将会被的很臃肿,所以这里需要 使用反射加上配置文件来简化。  

 工厂方法模式 : 声明一个创建 对象的方法,然后由子类去决定要实例化那个,也就是将类的实例化推迟到子类。比如 手机专卖店 可能有小米专卖店,苹果专卖店。 通过继承的方式来有子类去决定 实例  化那个 小米专卖店就实例化 红米,note,米4 等,苹果专卖店就实例化 6,6plus,5s等  注意 依赖: 店铺依赖 手机,具体的手机也需要 依赖手机 ,从而倒置这种依赖关系,高层组建和底层组建 依赖同样的 东西!  

 

 抽象工厂模式 : 定义一个接口 用来创建相关和依赖的产品族,注意这里是产品族,就是一类产品,比如下面代码中 显示屏 有 小米显示屏,华为显示屏,苹果显示屏 抽象工厂模式的uml 图:  

 

 具体要点: 所有的工厂都是封装创建对象的

           

   简单工厂并不能算是一个设计模式,但是它仍然将具体的实体类从应用程序中解耦。 

  工厂方法 是通过继承的方式 由子类去决定具体实例化那一个对象,将具体类的实例化推迟到子类中

 

抽象工厂方法: 通过工厂暴露出来的接口,来创建一类产品,也就是创建产品族。

 

所有工厂都是为了将对应的具体类 从应用程序中解耦,使程序设计 更加满足依赖抽象这一个原则。

 

 

代码如下:

package www.factory.com;
import www.prodcut.com.Batteries;
import www.prodcut.com.Recharger;
import www.prodcut.com.Screen;
public interface PhonePartsFactroy {
 public Batteries getBatteries();
 
 public Screen getScreen();
 
 public Recharger getRecharger();
 
} 
package www.factory.com;
import www.prodcut.com.Batteries;
import www.prodcut.com.IphoneBatteries;
import www.prodcut.com.IphoneRecharger;
import www.prodcut.com.IphoneScreen;
import www.prodcut.com.Recharger;
import www.prodcut.com.Screen;
public class IPhonePartsFactroy  implements PhonePartsFactroy{
 @Override
 public Batteries getBatteries() {
  return new IphoneBatteries();
 }
 @Override
 public Screen getScreen() {
  return new IphoneScreen();
 }
 @Override
 public Recharger getRecharger() {
  return  new IphoneRecharger();
 }
}
package www.factory.com;
import www.prodcut.com.Batteries;
import www.prodcut.com.HuaWeiBatteries;
import www.prodcut.com.HuaWeiRecharger;
import www.prodcut.com.HuaWeiScreen;
import www.prodcut.com.Recharger;
import www.prodcut.com.Screen;
public class HuaweiPartsFactroy implements PhonePartsFactroy{
 @Override
 public Batteries getBatteries() {
  return new HuaWeiBatteries();
 }
 @Override
 public Screen getScreen() {
  return new HuaWeiScreen();
 }
 @Override
 public Recharger getRecharger() {
  return new HuaWeiRecharger();
 }
}
package www.prodcut.com;
public interface Batteries {
 public String  getBattersName();
}
package www.prodcut.com;
public interface Recharger {
 public String getRechargerName();
}

package www.prodcut.com;
public interface Screen {
 public String getScreenName();
}
package www.prodcut.com;
public class HuaWeiBatteries implements  Batteries{
 @Override
 public String getBattersName() {
   
    return "华为原装电池";
 }
}
package www.prodcut.com;
public class IphoneBatteries implements Batteries{
 @Override
 public String getBattersName() {
  return "苹果原装电池";
 }
}
package www.prodcut.com;
public class HuaWeiRecharger implements Recharger{
 @Override
 public String getRechargerName() {
  return "华为手机充电器";
 }
}
package www.prodcut.com;
public class IphoneRecharger  implements Recharger{
 @Override
 public String getRechargerName() {
  return "苹果手机充电器";
 }
}
package www.prodcut.com;
public class HuaWeiScreen implements Screen{
 @Override
 public String getScreenName() {
  return "华为显示屏";
 }
}
package www.prodcut.com;
public class IphoneScreen implements  Screen{
 @Override
 public String getScreenName() {
  
  return "苹果显示屏";
 }
}

package www.test.com;
import www.factory.com.HuaweiPartsFactroy;
import www.factory.com.IPhonePartsFactroy;
import www.factory.com.PhonePartsFactroy;
public class Test {
 
 public static void main(String[] args){
  PhonePartsFactroy phonePartsFactroy = new IPhonePartsFactroy();
  String name = phonePartsFactroy.getBatteries().getBattersName();
  System.out.println(name);
  
  
  PhonePartsFactroy huaweiPartsFactroy = new HuaweiPartsFactroy();
  String name1 = huaweiPartsFactroy.getBatteries().getBattersName();
  System.out.println(name1);
 }
 
}

© 著作权归作者所有

上一篇: Spring 注解配置
下一篇: 装饰者模式
西门向东
粉丝 1
博文 15
码字总数 7122
作品 0
大连
私信 提问
HeadFirst设计模式4-工厂模式

1.为啥需要工厂模式(why) 在我平常的工作中我们往往会写下如下的代码。 以上代码的问题在于我们要增加种类的时候,需要打开这段代码进行修改。这样造成系统难以维护,也更容易犯错。 我们对...

maskwang520
2017/11/03
0
0
设计模式:简单工厂、工厂方法、抽象工厂之区别和小结

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。 本文是本人对这三种模式学...

洋哥6
2015/12/30
99
0
Happy 设计模式之工厂模式(Java)

闲暇之余学习设计模式。只是把我理解的整理成笔记,如果有不对的地方,请各位大牛指出。 工厂模式 1、简单工厂模式、 2、工厂方法模式、 3、抽象工厂模式、 下面首先介绍简单工厂模式: 先看...

豆芽菜橙
2018/07/03
0
0
创建型设计模式-抽象工厂模式

模式介绍 前段时间介绍了工厂方法模式。 本次介绍的模式非常容易和工厂方法模式混淆,并且复杂度也有一定的提升,叫做抽象工厂模式。 其实在现实生活中,工厂都会生产某一样具体的产品,不存...

黑色小老虎丶
2017/08/02
0
0
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
52分钟前
4
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
4
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
3
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
3
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部