关闭

Java 设计模式 之 工厂模式

标签: java设计模式工厂模式对象class
604人阅读 评论(0) 收藏 举报
分类:

简介

前言:

工厂模式主要是为了我们在创建对象提供过渡接口,这样就能将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 所以对于比较常用的设计模式(工厂模式),这也是我们必须要掌握的

分类 :

工厂模式主要被分为三种

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)

对于工厂模式这种设计模式,我们可以用实际开发中遇到的问题来举个例子,如果你现在正在开发一个应用或者是一个界面,你需要不同风格的按钮,对于生产出不同的按钮,在没有工厂模式的时候你需要这样做

ButtonA a = new ButtonA();
ButtonB b = new ButtonB();
ButtonC c = new ButtonC();

显而易见,这种方式在我们刚学习的时候都是用的这种方法,但是当我们在实际开发中这样写代码虽然能完成功能,但是这样是不利于维护的,如果要修改代码就需要修改引用类型的名字,这在代码比较多的项目里面并不简单,所以我们使用工厂模式,下面我使用了三种不同的工厂模式

简单工厂模式 :

简单工厂模式的原理很简单,我们通过一个ButtonFactory的类来进行管理我们需要进行得到不同的Button类型,下面我们通过这张图来熟悉简单工厂模式的流程
这里写图片描述
相信上面的流程图已经能说明一切了,首先我们通关Control这个类来实例化ButtonFactory通过getButton传入需要的Button类型然后根据需要的类型来进行实例化不同的Button下面请看代码


Button类


public  class Button {
    public Button() {

    }
}

MacButton类

public class MacButton extends Button{
    public MacButton() {
    System.out.println("MacButton..........");
    }
}

WindowsButton类


public class WindowsButton extends Button{
    public WindowsButton() {
    System.out.println("WindowsButton..........");
    }
}

UbuntuButton类

public class UbuntuButton extends Button{
    public UbuntuButton() {
    System.out.println("UbuntuButton..........");
    }
}

ButtonType(按钮类型)

public enum ButtonType {
    mac,window,ubuntu;
}

ButtonFactory类

public class ButtonFactory {

    public Button getButton(ButtonType type) {
    if (type == ButtonType.mac) 
        return new MacButton();
    else if(type == ButtonType.window)
        return new WindowsButton();
    else if(type == ButtonType.ubuntu)
       return new UbuntuButton();
    else 
        return new Button() ;
    }
}

Control类

public class Control {
    public static void main(String[] args) {
    ButtonFactory btnFactory = new ButtonFactory();
    /*只需要传递不同的类型就返回不同的Button*/
    Button mac_btn = btnFactory.getButton(ButtonType.mac); 
    }
}

上面你所看到的就是简单工厂模式,现在我们来看一下工厂方法模式


工厂方法模式 :

工厂方法模式主要是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类

对于工厂方法模式我们一般都是定义一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。

也许你会看完我上面的叙述有点混乱,请别着急,下面我们来通过这张流程图我们来搞懂工厂方法模式是怎么工作的

这里写图片描述
我们首先通过Control引用一个Factory 通过产生不同Button的Factory实例,通过Button的factory来获取到不同样式的按钮实例,下面是具体代码

Button接口

public interface Button {
    public  void Introduce_yourself();
}

三种Button样式

public class MacButton implements Button {

    @Override
    public void Introduce_yourself() {
    System.out.println("MacButton..........");
    }

}
public class UbuntuButton implements Button {

    @Override
    public void Introduce_yourself() {
    System.out.println("UbuntuBuuton............");
    }

}


public class WindowsButton implements Button {

    @Override
    public void Introduce_yourself() {
    System.out.println("WindowsButton..........");
    }
}

三种Button类型的Factory

public class FactoryMac implements ButtonFactory{

    @Override
    public Button getButton() {

    return new MacButton();
    }

}
public class FactoryUbuntu implements ButtonFactory{

    @Override
    public Button getButton() {

    return new UbuntuButton();
    }

}
public class FactoryWindows implements ButtonFactory{
    @Override
    public Button getButton() {

    return new WindowsButton();
    }
}

控制类

public class Control {
    public static void main(String[] args) {
    ButtonFactory factory = new FactoryMac();
    Button btn_mac = factory.getButton();
    btn_mac.Introduce_yourself();
   }
}

可以看到我们在Control中将ButtonFactory的引用赋值到一个FactoryMac所产生的实例上面


运行结果:

MacButton..........

对于工厂方法模式的优缺点

优点 :

  • 因为每个具体工厂类只负责创建产品,没有简单工厂中的逻辑判断,因此符合单一职责原则。
  • 与简单工厂模式不同,工厂方法并不使用静态工厂方法,可以形成基于继承的等级结构。

缺点 :

  • 不利于扩展,添加的Button时,除了增加新的Button类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销
  • 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要换用另外一种产品,仍然需要修改实例化的具体工厂。

抽象工厂模式 :

对于抽象工厂模式 ,它与工厂方法模式最大的区别在于抽象工厂中每个工厂可以创建多个种类的产品(Button)。也许你还是不太懂,下面习惯性的看一张流程图
这里写图片描述

在这里我们通过Control引用一个Factory然后直接将new出来的ButtonFactory赋值个给引用的Factory,直接通过Factory引用的对象来进行活动不同的Button类型,下面是具体代码


三个接口

public interface MacButton {

}
public interface UbuntuButton {

}
public interface WindowsButton {

}

三个具体实现类

public class SpecificMacButton implements MacButton{
    public SpecificMacButton() {
    System.out.println("MacButton...........");
    }
}

public class SpecificUbuntuButton implements UbuntuButton{
    public SpecificUbuntuButton() {
    System.out.println("UbuntuButton.................");
    }

}
public class SpecificWindowsButton implements WindowsButton {
    public SpecificWindowsButton() {
    System.out.println("WindowsButton............");
    }
}

Factory 接口与ButtonFactory类


public interface Factory {
    public MacButton getMacButton();
    public WindowsButton getWindowsButton();
    public UbuntuButton getUbuntuButton();
}

public class ButtonFactory implements Factory {

    @Override
    public MacButton getMacButton() {

    return new SpecificMacButton();
    }

    @Override
    public WindowsButton getWindowsButton() {

    return new SpecificWindowsButton();
    }

    @Override
    public UbuntuButton getUbuntuButton() {

    return new SpecificUbuntuButton();
    }

}

最后就是Control调用了

public class Control {
    public static void main(String[] args) {
    Factory factory = new ButtonFactory();
    factory.getMacButton();
    factory.getUbuntuButton();
    factory.getWindowsButton();
    }
}

运行结果

MacButton...........
UbuntuButton.................
WindowsButton............

抽象工厂模式是对工厂方法模式的一种延伸,通过一个Factory就能得到不同的Button实例这样大大简便了,使的这样增加新的Button样式就会更为方便

好了关于工厂模式的三种运用我就讲到这里了

2
0
查看评论

设计模式(一) 工厂模式 五种写法总结

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】系列开篇瞎BB设计模式相关的文章学习与总结,一直有意为之,一直又觉得时机不到。一 是怕自己代码经验还不够,学习了也不懂,强行理解没有意义。二 是怕...
  • zxt0601
  • zxt0601
  • 2016-10-12 16:47
  • 13354

JAVA设计模式---工厂模式理解

前言多年的java经验,说句实话并没有刻意的去看设计模式相关的东西,但是设计模式相关的应用就在实际应用中,比如hibernate中connection的获取,根据不同的properties的配置内容,不同的参数,从而获取不同的connection,并且调用connection相关方法对DB进行操作。...
  • zhang6622056
  • zhang6622056
  • 2016-09-21 14:48
  • 593

Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)

模式描述 提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。 2.模式作用 可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。 可以一定程度增加扩展性,若增加...
  • ooppookid
  • ooppookid
  • 2015-01-13 15:09
  • 3358

研磨设计模式之简单工厂模式(模式讲解)

3.1  典型疑问        首先来解决一个常见的疑问:可能有朋友会认为,上面示例中的简单工厂看起来不就是把客户端里面的“new Impl()”移动到简单工厂里面吗?不还是一样通过new一个实现类来得到接口吗?把“new Impl()”...
  • idwtwt
  • idwtwt
  • 2014-09-29 11:51
  • 267

j2ee常用的设计模式?说明工厂模式

Java中的23种设计模式:Factory(工厂模式),Builder(建造模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式),Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式), Composite...
  • v_fei
  • v_fei
  • 2007-11-28 09:36
  • 1307

设计模式之三:工厂方法模式—多态工厂的实现

简单工厂的严重问题: 当系统中需要引进新产品时,静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,违背了开闭原则 引入工厂方法模式: 针对不同的产品提供不同的工厂 定义: 定义一个用于创建对象的接口,让子类决定将 哪一个类实例化,工厂方法迷失让一个类...
  • wujunwen
  • wujunwen
  • 2016-09-22 15:25
  • 690

设计模式_改进策略模式_策略模式与简单工厂模式结合(Java)

上一篇我们介绍了《设计模式_策略模式(Java)》,同时讲述了策略模式与状态模式的区别,如果仔细查看代码或者类图,我们会发现策略模式在一定程度上是存在缺陷的,Client(Test类)必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着Client必须理解这些算法的区别,以便适时选择恰当的算...
  • tb3039450
  • tb3039450
  • 2016-09-22 20:00
  • 1050

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method)分为三种: 一、普通工厂模式。就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 1、uml建模图:
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014-10-04 22:29
  • 2592

调侃《Head First 设计模式》之工厂模式(二)

上一篇讲了简单工厂和工厂方法,在讲抽象工厂模式之前,现在先分析下简单工厂和工厂方法的主要特点和区别:简单工厂最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件实时动态实例化相关的类,对于客户端来说去除了与具体产品的依赖,增加新的产品种类不用修改客户端。最大的缺点是如果要增加新的产品种类...
  • sinat_23092639
  • sinat_23092639
  • 2015-04-18 20:50
  • 554

工厂模式及在项目中的应用

工厂模式分为简单工厂、工厂方法模式和抽象工厂模式。简单工厂顾名思义是最简单的,从一个工厂获取所需的产品类似于factory.getProduct1();或factory.getProduct2(),最经典的运用switch语句。简单工厂要增加产品要修改源码,破坏ocp原则(对扩展开放,修改封闭) ...
  • empyan
  • empyan
  • 2017-02-06 21:20
  • 2444
    个人资料
    • 访问:112194次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论