设计模式--->工厂模式

作者:无名    it人知识库   2020-09-15 00:00:00

静态工厂模式:

public interface Car {
 public void drive();  //开车
}
public class Benz implements Car {
 @Override
 public void drive() {
  // TODO Auto-generated method stub
        System.out.println("Drive Benz!!!");
 }
}
public class Bmw implements Car {
 @Override
 public void drive() {
  // TODO Auto-generated method stub
  System.out.println("Drive Bmw!!!");
 }
}
public class Driver {
 public static Car driveCar (String s ) throws Exception{
  
  if(s.equalsIgnoreCase("Benz")){
   return new Benz();
  }
  if(s.equalsIgnoreCase("Bmw")){
   return new Bmw();
  }
  else throw new Exception();
 }
}
public class Magnate {
 public static void main(String[] args) throws Exception {
  
  //Car car = new Benz();
  Car car = Driver.driveCar("benz");
  car.drive();
  
 }
}

但是工厂部分好像不太理想,因为 每增加一辆车,都要在工厂类中增加相应的业务逻辑或者判断逻辑,这显然是违背开闭原则 的。可想而知对于新产品的加入,工厂类是很被动的。

 

工厂方法模式:

public interface Car {
 public void drive();  //开车
}
public class Benz implements Car {
 @Override
 public void drive() {
  // TODO Auto-generated method stub
        System.out.println("Drive Benz!!!");
 }
}
public class Bmw implements Car {
 @Override
 public void drive() {
  // TODO Auto-generated method stub
  System.out.println("Drive Bmw!!!");
 }
}
public interface Driver {
 public Car driveCar();
 
}
public class BenzDriver implements Driver {
 @Override
 public Car driveCar() {
  // TODO Auto-generated method stub
  return new Benz();
 }
}
public class BmwDriver implements Driver {
 @Override
 public Car driveCar() {
  // TODO Auto-generated method stub
  return new Bmw();
 }
}
public class Magnate {
 public static void main(String[] args) {
  try {
   
   Driver driver = new BenzDriver();
   Car car =  driver.driveCar();
   car.drive();
   
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }
}

可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大 量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情况,可以考虑使 用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类 (一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。

好处:

可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。

抽象工厂模式:

public class Benz implements CreateBenz {
 @Override
 public void createCar() {
  // TODO Auto-generated method stub
  System.out.println("create Benz ");
 }
}
public class Bmw implements CreateBmw {
 @Override
 public void createCar() {
  // TODO Auto-generated method stub
  System.out.println("create Bmw");
 }
}
public interface CreateBenz {
 public void createCar();
}
public interface CreateBmw {
 public void createCar();
}
public interface CreateCarFactory {
 public CreateBenz CreateBenzFactory();
 public CreateBmw  CreateBmwFactory();
}
public class CreateCarFactoryImpl implements CreateCarFactory {
 @Override
 public CreateBenz CreateBenzFactory() {
  // TODO Auto-generated method stub
  return new Benz();
 }
 @Override
 public CreateBmw CreateBmwFactory() {
  // TODO Auto-generated method stub
  return new Bmw();
 }
}
public class Test {
 public static void main(String[] args) {
  CreateCarFactory createCarFactory = new CreateCarFactoryImpl();
  createCarFactory.CreateBenzFactory().createCar();
  createCarFactory.CreateBmwFactory().createCar();
 }
}

   抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

适用场景

       当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

总结

       无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。     所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

该篇内容就是由it人知识库(原文链接:https://m.itpeo.net/15310/3710241.html)小编为各位整理

Tag:设计模式工厂



我要分享:

  • 微信
  • QQ好友
  • QQ空间
  • 新浪微博


热门推荐

设计模式--->观察者模式

设计模式--->观察者模式

   观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模... ...

方正T630NVUT630N-440

方正T630NVUT630N-440

<iframe name="google_ads_frame" marginwidth="0" marginhei... ...

学习笔记-android imageSwitcher使用

学习笔记-android imageSwitcher使用

照片切换控件imageSwitcher实现照片上一张、下一张的切换,使用时要实现ViewFactory接口,从而将显示的... ...

ORACLE闪回功能开启和使用

ORACLE闪回功能开启和使用

闪回功能在ORACLE中默认是关闭的,需要按照下面的方式开启: Sql>startup mount Sq... ...

openfire 源代码搭建 开发环境(一)

openfire 源代码搭建 开发环境(一)

1、搭建好java开发环境,要求是在jdk1.6以上   2、在http://www.ignit... ...

[Repeater]导出为excel格式

[Repeater]导出为excel格式

Repeater导出为excel格式 数据绑定到Repeater1 ,下面是将Repeater1的内容导出的示例代码 ... ...

ADO.NET的主要组件

ADO.NET的主要组件

ADO.NET提供了用于访问和操作数据的两个主要组件是 .NET Framework 数据提供程序和 DataSe... ...

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量... ...

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(三)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(三)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) C++11新特性中的匿名函数Lambda表... ...

[zt]Ajax 和 XML: 五种常见 Ajax 模式

[zt]Ajax 和 XML: 五种常见 Ajax 模式

可立即使用这些非常有用的 Ajax 设计模式 ... ...

MDA:Jean网站上的定义和资源

MDA:Jean网站上的定义和资源

继续纠缠MDA的定义 转自 http://www.sciences.univ-nantes.fr/info/lrsg... ...

Spring Framework 4.0M1 & 3.2.3 发布了[翻译]

Spring Framework 4.0M1 & 3.2.3 发布了[翻译]

今天早上去SpringSource官网,发现Spring Framework 4.0发布了,我认为最重要的两个特性... ...

简单说一下Jfinal Model静态dao对象误用的问题

简单说一下Jfinal Model静态dao对象误用的问题

   最近有很多jfinal的使用者在误用model静态dao,这里简单的说一下这个问题, @... ...

职业生涯第二年回顾(2011.2~2012.2)

职业生涯第二年回顾(2011.2~2012.2)

 算不上什么工作总结和技术总结,只是大致回顾这1年记忆中的事情。    一... ...

使用import简化spring的配置文件 (转载)

使用import简化spring的配置文件 (转载)

Spring中用import导入配置文件 原文地址:使用import简化spring的配置文件 (转载)作者:瓦砾... ...

每天十分钟,十二天入门Python(十)

每天十分钟,十二天入门Python(十)

# __str__() class Dog(object):     de... ...

JQuery:deferred对象的方法

JQuery:deferred对象的方法

(1) $.Deferred() 生成一个deferred对象。 (2) deferred.done() 指... ...

Maven的安装及与eclipse或MyEclipse的关联

Maven的安装及与eclipse或MyEclipse的关联

apache-Maven的下载就不说了,其安装与JDK的安装几乎类似。当然使用Maven的前提是已经安装好了JD... ...

怎么在HiWork中注册团队及添加成员

怎么在HiWork中注册团队及添加成员

周三,天气较热,各位注意身体,多饮水。 使用HiWork,首先要进行团队创建以及成员添加,这样才能愉快地... ...

linux wineQQ与win7QQ共用聊天记录

linux wineQQ与win7QQ共用聊天记录

首先挂载win7硬盘,挂载方法就不介绍了。 然后点开QQ的设置  -> 文件管理 -&g... ...

最新IT资讯

必填

◎已有 0 人评论


电脑版

版权所有:IT人知识库 m.itpeo.net

返回顶部

本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点,如有侵权请联系我们删除