设计模式——工厂模式

原创 2012年03月21日 20:00:47

工厂模式:工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

1)简单工厂模式(Simple Factory):不利于产生系列产品;

2)工厂方法模式:

(生产同一种类型的产品,不同风味) 将生产产品的类做成抽象类,抽象方法中创建产品。由子类处理对象的实例化。

3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;

一·首先我们实现简单工厂模式:

我们的需求是建立交通工具类,该类有移动的功能,因为交通工具有很多种具体的产品,所以我们抽象出Moveable接口:

package com.lcq.factory;
 
 public interface Moveable {
     public void run();
 }

然后我们创建具体的实现类:

package com.lcq.factory;
 
 public class Plane implements Moveable{
 
     @Override
     public void run() {
         System.out.println("扇着翅膀飞奔而来。。。");
     }
 
 }

接下来我们将Plane类创建对象的过程进行封装,实现工厂。在实现工厂类之前,我们可以对工厂类进行抽象,创建抽象工厂类:

package com.lcq.factory;
 
 public abstract class VehicleFactory {
     public abstract Moveable create();
 }

在具体的工厂类中继承抽象的工厂类:

package com.lcq.factory;
 
 public class PlaneFactory extends VehicleFactory{
 
     @Override
     public Moveable create() {
         return new Plane();
     }
 }

这样客户就可以使用工厂进行对象的创建和使用了:

package com.lcq.factory;
 
 public class Test2 {
     public static void main(String[] args) {
         
         VehicleFactory factory = new PlaneFactory();
 //        VehicleFactory factory = new BroomFactory();
         
         Moveable m = factory.create();
         m.run();
     }
 
 }

假如我们想提供另外的交通工具类就会非常灵活。比如我们想将交通工具换成扫帚,则可以创建Broom对象:

package com.lcq.factory;
 
 public class Broom implements Moveable{
 
     @Override
     public void run() {
         System.out.println("刮着沙尘暴呼啸而来。。。");
     }
 
 }

实现它的工厂生产类:

package com.lcq.factory;
 
 public class BroomFactory extends VehicleFactory{
 
     @Override
     public Moveable create() {
         return new Broom();
     }
 
 }

在客户类中替换掉工厂就可以了:

VehicleFactory factory = new BroomFactory();

所以简单工厂模式对于创建新的产品是比较方便灵活的;

简单工厂类图:


二.工厂方法


简单的模拟一下工厂方法:

interface IProduct { 
    public void productMethod(); 
} 
   
class Product implements IProduct { 
    public void productMethod() { 
        System.out.println("产品"); 
    } 
} 
   
interface IFactory { 
    public IProduct createProduct(); 
} 
   
class Factory implements IFactory { 
    public IProduct createProduct() { 
        return new Product(); 
    } 
} 
   
public class Client { 
    public static void main(String[] args) { 
        IFactory factory = new Factory(); 
        IProduct prodect = factory.createProduct(); 
        prodect.productMethod(); 
    } 
} 

工厂方法类图:



三·抽象工厂实现

我们的需求是客户需要一系列的产品,比如这些产品包括:交通工具,武器,食物。

我们首先创建这些产品:

交通工具:

package com.lcq.factory.abstractfactory;
 
 public abstract class Vehicle {
     public abstract void run();
 }

具体的交通工具Car:

package com.lcq.factory.abstractfactory;
 /**
  * 单例模式和工厂方法模式
  * @author lcq
  *
  */
 
 public class Car extends Vehicle{
 
     @Override
     public void run() {
         System.out.println("开车去东北。。。");
         
     }
     
 }

武器:

package com.lcq.factory.abstractfactory;
 
 public abstract class Weapon {
     public abstract void shoot();
 
 }

具体的武器实现:

package com.lcq.factory.abstractfactory;
 
 public class AK47 extends Weapon {
 
     @Override
     public void shoot() {
         System.out.println("da da da...");
     }
 
 }

食物:

package com.lcq.factory.abstractfactory;
 
 public abstract class Food {
     public abstract void print();
 }

具体的食物:

package com.lcq.factory.abstractfactory;
 
 public class Apple extends Food {
 
     @Override
     public void print() {
         System.out.println("eat apple");
     }
 
 }

接下来定义我们的抽象工厂类,在该类中我们定义抽象的创建交通工具和武器以及食品的抽象方法:

package com.lcq.factory.abstractfactory;
 
 public abstract class AbstractFactory {
     public abstract Vehicle createVehicle();
     public abstract Weapon createWeapon();
     public abstract Food createFood();
     
 }

定义具体生产产品的工厂类:

package com.lcq.factory.abstractfactory;
 
 public class DefaultFactory extends AbstractFactory {
 
     @Override
     public Vehicle createVehicle() {
         return new Car();
     }
 
     @Override
     public Weapon createWeapon() {
         return new AK47();
     }
 
     @Override
     public Food createFood() {
         return new Apple();
     }
 
 }

这样客户就可以利用工厂类去使用系列产品了:

package com.lcq.factory.abstractfactory;
 /**
  * 测试抽象工厂
  * @author lcq
  *
  */
 public class test {
     public static void main(String[] args) {
         
         AbstractFactory factory = new DefaultFactory();
         
         Vehicle vehicle = factory.createVehicle();
         vehicle.run();
         Weapon weapon = factory.createWeapon();
         weapon.shoot();
         Food food = factory.createFood();
         food.print();
         
         
         
         
     }
 
 }

以上是实现了一个系列的产品,如果想改成其他系列的产品,可以比较方便的实现:

创建另外系列的产品:

交通工具:

package com.lcq.factory.abstractfactory;
 
 public class Broom extends Vehicle {
 
     @Override
     public void run() {
         System.out.println("冒着沙尘暴一路飞奔而来。。。");
     }
 
 }

武器:

package com.lcq.factory.abstractfactory;
 
 public class MagicStick extends Weapon {
 
     @Override
     public void shoot() {
         System.out.println("fire hu hu hu...");
     }
 
 }

食品:

package com.lcq.factory.abstractfactory;
 
 public class MushRoom extends Food {
 
     @Override
     public void print() {
         System.out.println("mushroom");
     }
 
 }

创建好对应的工厂类:

package com.lcq.factory.abstractfactory;
 
 public class MagicFactory extends AbstractFactory{
 
     @Override
     public Vehicle createVehicle() {
         return new Broom();
     }
 
     @Override
     public Weapon createWeapon() {
         return new MagicStick();
     }
 
     @Override
     public Food createFood() {
         return new MushRoom();
     }
 
 }

在客户类中修改即可更换产品系列:

AbstractFactory factory = new MagicFactory();


抽象工厂类图:


三·模拟spring实现工厂模式

基本思路是结合配置文件实现工厂模式。

和先前的流程相似,创建Moveable接口和其实现类Car:

package com.spring.factory;
 
 public interface Moveable {
     public void run();
 }

package com.spring.factory;
 /**
  * 单例模式和工厂方法模式
  * @author lcq
  *
  */
 
 public class Car implements Moveable{
 
     @Override
     public void run() {
         System.out.println("开车去东北。。。");
     }
 }

再添加一个实现类Train;

package com.spring.factory;
 
 public class Train implements Moveable {
 
     @Override
     public void run() {
         System.out.println("开着火车冒着烟。。。");
     }
 
 }

创建配置文件spring.properties:

vehicleType=com.spring.factory.Train

在客户类中使用工厂:

package com.spring.factory;
 
 import java.util.Properties;
 
 public class Test {
     public static void main(String[] args) throws Exception {
         Properties properties = new Properties();
         properties.load(Test.class.getClassLoader().getResourceAsStream(
                 "com/spring/factory/spring.properties"));
         String vehicleTypeName = properties.getProperty("vehicleType");
         Object o = Class.forName(vehicleTypeName).newInstance();
 
         Moveable m = (Moveable) o;
         m.run();
     }
 }

这样在更改产品时可以直接修改配置文件,比如:

vehicleType=com.spring.factory.Car

即可。




版权声明:本文为博主原创文章,未经博主允许不得转载。

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

Java中的23种设计模式:Factory(工厂模式),Builder(建造模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式),F...
  • v_fei
  • v_fei
  • 2007年11月28日 09:36
  • 1307

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

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】系列开篇瞎BB设计模式相关的文章学习与总结,一...
  • zxt0601
  • zxt0601
  • 2016年10月12日 16:47
  • 13391

调侃《HeadFirst设计模式》之工厂模式(一)

今天我们再次跟随《HeadFirst设计模式》的脚步,
  • sinat_23092639
  • sinat_23092639
  • 2015年04月11日 21:23
  • 1822

大话设计模式—工厂模式

一、简介工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模...
  • lmb55
  • lmb55
  • 2015年05月31日 14:42
  • 1137

golang设计模式之简单工厂模式

1. 写在前面在面向对象的编程语言中(如java,C++)设计模式的概念广为人知, 应用的也非常广泛。设计模式让我们的代码变得灵活起来,具有很强的扩展性。但在与C语言比肩的Go语言中,设计模式的概念并...
  • Jeanphorn
  • Jeanphorn
  • 2017年08月31日 23:15
  • 2128

软件设计模式——简单工厂模式(Simple Factory)

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于...
  • Jungle_hello
  • Jungle_hello
  • 2016年04月13日 21:40
  • 620

23种设计模式—之简单工厂模式

简单工厂模式(SimpleFactory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实...
  • JavaWebRookie
  • JavaWebRookie
  • 2015年11月06日 13:46
  • 2251

设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个...
  • oktears
  • oktears
  • 2014年06月29日 15:40
  • 2182

【设计模式】HeadFirst设计模式(四):工厂模式

设计模式要求我们不应该针对实现编程,为了降低耦合度,提高可维护性。当程序中出现“new”的时候,就证明程序在实例化一个具体类,所以用的是实现,而不是接口。如果代码绑着具体的类会导致代码更加脆弱,缺乏弹...
  • u010800530
  • u010800530
  • 2015年05月31日 22:47
  • 1007

设计模式练习(2)——工厂模式

工厂模式一、题目:现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器ImgReader,如gif图片读取器GifReader用于读取gif格式的图片,jpg图片读取...
  • qq_33220449
  • qq_33220449
  • 2017年01月18日 17:10
  • 497
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式——工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)