java设计模式---工厂模式(工厂方法模式)

工厂模式总述

工厂模式属于类的创建模式,工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类。工厂模式有三个基本形态:

1. 简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。

2. 工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。

3. 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。

工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

来看下它的组成:

1. 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2. 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

3. 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4. 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活起来——当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!

好了,废话不多说,直接上代码。首先抽象一下场景:

某影视公司要拍一部战争题材的电视剧,要求XXX军工厂建造模型,包括能飞的飞机,能跑的坦克和能下水的船。然后XXX军工厂按照要求开始建造模型。

抽象的产品角色

[java]

public interface Moveable {

void move();

}

抽象的工厂角色

[java]

public abstract class VehicleFactory{

public abstract Moveable creat();

}

具体的产品角色

[java]

public class Plane implements Moveable {

@Override

public void move() {

System.out.println("plane fly...");

}

}

public class Tank implements Moveable {

@Override

public void move() {

System.out.println("tank run...");

}

}

public class Boat implements Moveable {

@Override

public void move() {

System.out.println("boat swim...");

}

}

具体的工厂角色

[java]

public class PlaneFactory extends VehicleFactory {

@Override

public Moveable creat() {

return new Plane();

}

}

public class TankFactory extends VehicleFactory {

@Override

public Moveable creat() {

return new Tank();

}

}

public class BoatFactory extends VehicleFactory {

@Override

public Moveable creat() {

return new Boat();

}

}

具体的实现,这里是基于android实现的,java中单独写一个测试类在main方法中实现。

[java]

VehicleFactory planeFactory = new PlaneFactory();

Moveable planeMove = planeFactory.creat();

planeMove.move();

VehicleFactory tankFactory = new TankFactory();

Moveable tankMove = tankFactory.creat();

tankMove.move();

VehicleFactory boatFactory = new BoatFactory();

Moveable boatMove = boatFactory.creat();

boatMove.move();

看看输出:

然后大家又可以看到狗血的战争题材电视剧了......

工厂模式总述

工厂模式属于类的创建模式,工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类。工厂模式有三个基本形态:

1. 简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。

2. 工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。

3. 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。

工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

来看下它的组成:

1. 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2. 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

3. 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4. 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活起来——当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!

好了,废话不多说,直接上代码。首先抽象一下场景:

某影视公司要拍一部战争题材的电视剧,要求XXX军工厂建造模型,包括能飞的飞机,能跑的坦克和能下水的船。然后XXX军工厂按照要求开始建造模型。

抽象的产品角色

[java]

public interface Moveable {

void move();

}

抽象的工厂角色

[java]

public abstract class VehicleFactory{

public abstract Moveable creat();

}

具体的产品角色

[java]

public class Plane implements Moveable {

@Override

public void move() {

System.out.println("plane fly...");

}

}

public class Tank implements Moveable {

@Override

public void move() {

System.out.println("tank run...");

}

}

public class Boat implements Moveable {

@Override

public void move() {

System.out.println("boat swim...");

}

}

具体的工厂角色

[java]

public class PlaneFactory extends VehicleFactory {

@Override

public Moveable creat() {

return new Plane();

}

}

public class TankFactory extends VehicleFactory {

@Override

public Moveable creat() {

return new Tank();

}

}

public class BoatFactory extends VehicleFactory {

@Override

public Moveable creat() {

return new Boat();

}

}

具体的实现,这里是基于android实现的,java中单独写一个测试类在main方法中实现。

[java]

VehicleFactory planeFactory = new PlaneFactory();

Moveable planeMove = planeFactory.creat();

planeMove.move();

VehicleFactory tankFactory = new TankFactory();

Moveable tankMove = tankFactory.creat();

tankMove.move();

VehicleFactory boatFactory = new BoatFactory();

Moveable boatMove = boatFactory.creat();

boatMove.move();

看看输出:

然后大家又可以看到狗血的战争题材电视剧了......


相关文章

  • 几种常用的设计模式介绍
  • 几种常用的设计模式介绍 1. 设计模式的起源 最早提出"设计模式"概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才 ...查看


  • Spring内核研究-通过工厂注入
  • Spring内核研究-通过工厂注入 Spring专门设计了对工厂模式支持,你可以使用静态工厂方法来创建一个Bean,也可以使用实例工厂的方法来创建Bean.下面分别介绍这2种方法.静态工厂注入 定义一个Bean使用自己类上的静态工厂方法来创 ...查看


  • 工厂模式factory
  • 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列 ...查看


  • 最隐晦的程序设计指引
  • 最隐晦的程序设计指引 分类: 技术 杂评 设计模式 设计 2011-07-24 16:14 7315人阅读 评论(69) 收藏 举报 一.百家争鸣 俗话说,程序员半年不学新东西,就变奥特曼(out man,过时之人)了.IT行业可以说是变化 ...查看


  • DRP培训日志
  • 2008年12月24日(第一天),DRP业务流程 1. Web项目开发的一般流程 a) 需求确定 b) 需求分析 i. 架构分析和设计 ii. 业务逻辑分析和设计 iii. 界面设计 c) 开发环境搭建 d) 开发和测试 e) 文档编写 2 ...查看


  • 一个简单的例子说明java中spring框架的依赖注入
  • javaEE开发中,现在最成熟的框架之一应该就是spring了,spring框架最强大的地方就是实现了依赖注入(也叫控制反转),最近的一个项目中用的就是spring框架,spring框架是工厂模式的应用结合了MVC的设计思想,,大家可以看到 ...查看


  • 研磨设计模式之工厂方法模式-1
  • 做Java一晃就十年了,最近手痒痒,也决定跟随一下潮流,整个博客,写点东西,就算对自己的知识进行一个梳理和总结,也跟朋友们交流交流,希望能坚持下去. 先写写设计模式方面的内容吧,就是GoF的23个模式,先从大家最熟悉的工厂方法模式开始,这个 ...查看


  • Java员工管理系统实训报告
  • 实 习 报 告 年 级 大三 专 业 计算机科学与技术 学 号姓 名 实习时间 2016.8.8-2016.8.28 实习地点 三峡大学 一.实习目的 进一步了解java 开发的相关知识,掌握java 开发的基本技术,丰富java 开发的实 ...查看


  • 分层分包的缩写
  • O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO, ...查看


热门内容