Java二十三设计模式之------工厂方法模式

一、工厂方法模式

工厂方法模式有三种

1、普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:

举例如下:(我们举一个发送邮件和短信的例子)

首先,创建二者的共同接口:

  1. public interface Sender {
  2. public void Send();
  3. }

其次,创建实现类:

  1. public class MailSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is mailsender!");
  5. }
  6. }
  1. public class SmsSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is sms sender!");
  5. }
  6. }

最后,建工厂类:

  1. public class SendFactory {
  2. public Sender produce(String type) {
  3. if ("mail".equals(type)) {
  4. return new MailSender();
  5. } else if ("sms".equals(type)) {
  6. return new SmsSender();
  7. } else {
  8. System.out.println("请输入正确的类型!");
  9. return null;
  10. }
  11. }
  12. }

我们来测试下:

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. SendFactory factory = new SendFactory();
  4. Sender sender = factory.produce("sms");
  5. sender.Send();
  6. }
  7. }

输出:this is sms sender!

2、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:

将上面的代码做下修改,改动下SendFactory类就行,如下:

public class SendFactory {

public Sender produceMail(){

  1. return new MailSender();
  2. }
  3. public Sender produceSms(){
  4. return new SmsSender();
  5. }
  6. }

测试类如下:

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. SendFactory factory = new SendFactory();
  4. Sender sender = factory.produceMail();
  5. sender.Send();
  6. }
  7. }

输出:this is mailsender!

2.2、静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

  1. public class SendFactory {
  2. public static Sender produceMail(){
  3. return new MailSender();
  4. }
  5. public static Sender produceSms(){
  6. return new SmsSender();
  7. }
  8. }

[java] view plaincopy

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. Sender sender = SendFactory.produceMail();
  4. sender.Send();
  5. }
  6. }

输出:this is mailsender!

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

3、抽象工厂模式(Abstract Factory)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。

请看例子:

  1. public interface Sender {
  2. public void Send();
  3. }

两个实现类:

  1. public class MailSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is mailsender!");
  5. }
  6. }
  1. public class SmsSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is sms sender!");
  5. }
  6. }

两个工厂类:

  1. public class SendMailFactory implements Provider {
  2. @Override
  3. public Sender produce(){
  4. return new MailSender();
  5. }
  6. }
  1. public class SendSmsFactory implements Provider{
  2. @Override
  3. public Sender produce() {
  4. return new SmsSender();
  5. }
  6. }

在提供一个接口:

  1. public interface Provider {
  2. public Sender produce();
  3. }

测试类:

  1. public class Test {
  2. public static void main(String[] args) {
  3. Provider provider = new SendMailFactory();
  4. Sender sender = provider.produce();
  5. sender.Send();
  6. }
  7. }

其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!

本文内容出处 https://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html

时间: 2024-08-08 22:52:54

Java二十三设计模式之------工厂方法模式的相关文章

Java二十三设计模式之------享元模式

一.享元模式(Flyweight) 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类.一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属性,就

Java二十三设计模式之------中介者模式

一.中介者模式(Mediator) 中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改.如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用.先看看图: User类统一接口,User1和User2分别是不同的对象,二者之间有关联,如果不采用中介者模式,则需要二者相互持有引用,这样二者的耦合度很高,为了解耦,引入了Medi

Java设计模式之工厂方法模式(转) 实现是抽象工厂?

Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

C#设计模式(3)——工厂方法模式

一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary

03.设计模式_工厂方法模式

转载自:http://www.cnblogs.com/zhili/p/FactoryMethod.html 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时

【大话设计模式】—— 工厂方法模式

一.概念 想象一下我们的寻常见到的工厂,下一个订单,付了订金,一段时间后就能够提货.我们不须要知道工厂是用的什么机器,怎么安排工人的,从哪来的材料,只须要一个订单就好,工厂就能够依照其固定流水线做出我们所须要的产品.设计模式中也有类似的一个大神:工厂方法模式. 以下让我们来认识一下: 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二.UML图 Product(抽象产品) ConcreteProduct(

设计模式之工厂方法模式

anticipate 预料 = except ant蚂蚁 ic ic卡 ip ip卡 ate吃 我没有预料到小蚂蚁把我的ic,ip卡吃掉了. robust 强壮的 = strong ro rong容祖儿  bu不  st石头 容祖儿不喜欢强壮的石头. maintain 维持 = keep main主要的(大陆)  tain 台湾 大陆和台湾维持着若即若离的关系. 设计模式之工厂方法模式 动机:     一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,

每天一个设计模式-5 工厂方法模式

每天一个设计模式-5 工厂方法模式 1.模式定义 定义一个用于创建对象的接口,让子类决定实例化那一个类,Factory Method使一个类的实例化延迟到其子类. 2.工厂方法模式解决问题的思路 工厂方法模式需要接口对象,那就定义一个方法来创建这个接口对象(工厂方法):可是事实上它自己是不知道如何创建这个接口对象的,没有关系,定义成抽象方法让子类来实现就可以了:这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了. 3.实际问题 实现一个导出数据的功能,客户选择数据的导出格式

【设计模式】——工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使用一个类的实例化延迟到其子类.根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法.然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂.我们在要增加新的功能,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了.这样整个工厂和产品系其实都没有修改的