`
不平凡的人
  • 浏览: 35496 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

工厂设计模式

 
阅读更多

 本文从以下方面介绍工厂模式

一、总述

二、工厂方法

三、抽象工厂

 

一、总述

1、分类:

(1)简单工厂(静态工厂)

(2)工厂方法模式

(3)抽象工厂模式

 

 2、工厂模式意义:

      将程序中创建对象的部分单独抽取出来,实现与主程序之间的解耦。具有更好的扩展性及维护性。

 

3、工厂方法模式与抽象工厂模式异同点

 

(1)相同点:都是将对象(产品)单独抽取形成一个产品族,然后将创建对象的工厂也向上抽取形成一个工厂族

 

(2)异同点:

         ①抽象工厂中会有一系列的产品,而工厂方法中只有一个抽象的产品;

         ②抽象工厂模式的具体工厂中可以创建多个产品的实例,而工厂方法的具体工厂中只能创建一个产品的实例

 

(3)工厂方法模式中的角色:

         ①一个单一的抽象的产品类,该类可以创建出多个同类型的具体产品类;

         ②一个抽象工厂类,可以创建出多个具体的工厂类,每个工厂类也只能生产一种产品

 

(4)抽象工厂模式的角色:

         ①多个抽象的产品类,可以创建出多种类型的多个具体产品;

         ②一个抽象工厂类,可以创建出多个具体的工厂,每个工厂可以生产出多种产品

 

二、工厂方法

引入:任意定制交通工具的类型(一种产品)和生产过程

1、类图



 2、代码示例

2.1、交通工具接口

package net.oschina.design.factory1.factorymethod;

/**
 * 交通工具的接口类,定制任何一种与交通工具相关的产品
 * 
 * @author Freedom
 * 
 */
public interface Vehicle {

	/**
	 * vehicel run
	 */
	void run();
}

 2.1.1交通工具的具体实现

package net.oschina.design.factory1.factorymethod;

public class Air implements Vehicle {

	@Override
	public void run() {
		System.out.println("Air like lightning fly...--飞机。");
	}

}

 

package net.oschina.design.factory1.factorymethod;

public class Car implements Vehicle {

	@Override
	public void run() {
		System.out.println("Car quickly run...--汽车。");
	}

}

 

package net.oschina.design.factory1.factorymethod;

public class Train implements Vehicle {

	@Override
	public void run() {
		System.out.println("Train wu wu wu run...--火车。");
	}

}

2.2 交通工具的工厂接口

package net.oschina.design.factory1.factorymethod;

/**
 * 
 * @author Freedom
 * 
 */
public interface VehicleFactory {

	Vehicle createVehicle();
}

2.2.1具体的工厂实现类、

package net.oschina.design.factory1.factorymethod;

/**
 * 
 * @author Freedom
 * 
 */
public class AirFactory implements VehicleFactory {

	@Override
	public Vehicle createVehicle() {
		return new Air();
	}
}

 

package net.oschina.design.factory1.factorymethod;

/**
 * @author Freedom
 * 
 */
public class CarFactory implements VehicleFactory {

	@Override
	public Vehicle createVehicle() {
		/*
		 * 此处,可以定制小汽车的生产过程等等,此方法只是简单实现
		 */
		return new Car();
	}

}

 

package net.oschina.design.factory1.factorymethod;

/**
 * 
 * @author Freedom
 * 
 */
public class TrainFactory implements VehicleFactory {

	@Override
	public Vehicle createVehicle() {
		return new Train();
	}

}

2.3、测试方法

package net.oschina.design.factory1.factorymethod;

/**
 * 测试工厂方法模式 
 *工厂方法模式的优点:将对象的创建过程交给一个工厂去完成,实现了程序主流程创建对象时低耦合
 * 缺点:每新增一种产品的时候,产品类需要新增加,具体生产该产品的工厂也要新增加,这样会导致工厂泛滥
 * 可以将一系列产品放到同一个工厂中,这样如果该产品的系列不变化,只是增加产品的种类就不会引起工厂泛滥,要用到抽象工厂的方法
 * @author Freedom
 * 
 */
public class Main {

	public static void main(String[] args) {

		VehicleFactory f = new CarFactory();
		Vehicle c = f.createVehicle();
		c.run();

		f = new AirFactory();
		Vehicle air = f.createVehicle();
		air.run();
	}

}

 

2.4、工厂方法模式的组成

       1)抽象工厂:工厂方法模式的核心。是具体工厂角色必须实现的接口或者必须继承的父类;

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

       3)抽象产品:它是具体产品继承的父类或者是实现的接口;

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

 

三、抽象工厂

引入:任意定制系列产品(如:交通工具...多种产品)

1、类图



 2、代码示例

2.1、产品接口

package net.oschina.design.factory1.abstractFactory;

/**
 * 交通工具类
 * 
 * @author Freedom
 * 
 */
public interface Vehicle {

	void run();
}

 

package net.oschina.design.factory1.abstractFactory;

/**
 * 武器类
 * 
 * @author Freedom
 * 
 */
public interface Weapon {

	void shoot();
}

2.1.1产品具体实现

package net.oschina.design.factory1.abstractFactory;

public class Car implements Vehicle {

	@Override
	public void run() {
		System.out.println("Car quickly run...--汽车。");
	}

}

  

package net.oschina.design.factory1.abstractFactory;

public class Train implements Vehicle {

	@Override
	public void run() {
		System.out.println("Train wu wu wu run...--火车。");
	}

}

 

package net.oschina.design.factory1.abstractFactory;

public class Gun implements Weapon {

	@Override
	public void shoot() {
		System.out.println("Gun shotting...--枪。");
	}

}

 

package net.oschina.design.factory1.abstractFactory;

public class Tank implements Weapon {

	@Override
	public void shoot() {
		System.out.println("Tank shooting...--坦克。");
	}

}

 

2.2、抽象工厂抽象类

package net.oschina.design.factory1.abstractFactory;

/**
 * 抽象工厂用于生产一系列产品
 * 
 * @author Freedom
 * 
 */
public abstract class AbstractFactory {

	public abstract Vehicle createVehicle();

	public abstract Weapon createWeapon();
}

 2.2.1抽象工厂的具体实现

package net.oschina.design.factory1.abstractFactory;

/**
 * 生产大型工具的工厂
 * 
 * @author Freedom
 * 
 */
public class BigToolsFactory extends AbstractFactory {

	@Override
	public Vehicle createVehicle() {
		return new Train();
	}

	@Override
	public Weapon createWeapon() {
		return new Tank();
	}

}

 

package net.oschina.design.factory1.abstractFactory;

/**
 * 小型工具的工厂
 * 
 * @author Freedom
 * 
 */
public class SmallToolsFactory extends AbstractFactory {

	@Override
	public Vehicle createVehicle() {
		// TODO Auto-generated method stub
		return new Car();
	}

	@Override
	public Weapon createWeapon() {
		// TODO Auto-generated method stub
		return new Gun();
	}

}

2.3、运行类

package net.oschina.design.factory1.abstractFactory;

/**
 * 测试抽象工厂
 * 
 * @author Freedom
 * 
 */
public class Main {
	public static void main(String[] args) {
		/**
		 * 如果想替换工厂的时,直接将工厂的实现对象替换即可,程序的代码不需要修改
		 */
		AbstractFactory f = new SmallToolsFactory();
		Vehicle v = f.createVehicle();
		v.run();
		Weapon w = f.createWeapon();
		w.shoot();
	}
}

  

2.4、抽象工厂优缺点

(1)抽象工厂模式的优点

①分离接口和实现

  客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。

②使切换产品族变得容易

  因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。

(2)抽象工厂模式的缺点

①不太容易扩展新的产品系列

  如果需要给整个产品族添加一个新的产品系列,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

 

 

 

可参考文章

  • 大小: 20.3 KB
  • 大小: 28 KB
分享到:
评论

相关推荐

    工厂设计模式代码

    工厂设计模式是软件工程中广泛使用的一种创建型设计模式,它的主要目的是为了隔离对象的创建过程,使得客户端代码不直接创建对象,而是通过一个专门的工厂类来负责对象的实例化。这种模式使得系统在面对产品扩展时...

    工厂设计模式简单实例

    工厂设计模式是面向对象编程中的一种经典设计模式,它的主要目的是为了解耦对象的创建与使用,使得系统在不关心具体实现的情况下能够灵活地创建所需的对象。在这个名为"工厂设计模式简单实例"的资料中,我们可以期待...

    抽象工厂设计模式抽象工厂设计模式

    抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式

    ios 简单工厂设计模式

    简单工厂设计模式是其中一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这个接口就像一个工厂,根据输入条件生产不同类型的实例。 简单工厂模式的核心在于一个“工厂”类,这个类...

    C#工厂设计模式简单实例

    C#工厂设计模式简单实例——计算器 public class Factory { //创建一个静态方法 public static Operation CreateOper(int a, int b, string oper) { //创建一个Operation对象 Operation op = null; switch ...

    C#简单登录演示抽象工厂设计模式

    抽象工厂设计模式是其中一种创建型设计模式,它提供了一种创建对象家族的方法,这些对象来自同一个接口但属于不同的类。在这个“C#简单登录演示抽象工厂设计模式”的案例中,我们将深入探讨如何在C#中应用这个模式来...

    简单工厂设计模式

    ### 简单工厂设计模式概述 简单工厂模式(Simple Factory Pattern)是设计模式中较为基础的一种模式,属于创建型模式。它通过提供一个统一的接口来创建一系列相关的或相互依赖的对象,而无需指定具体类。 #### ...

    java 抽象工厂设计模式 案例

    Java抽象工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,一个工厂接口用于创建一系列相关的或相互依赖的对象,而无需指定它们的具体类。这种模式让代码与具体实现解耦,使得...

    设计模式资料之工厂设计模式

    在给定的“设计模式资料之工厂设计模式”中,我们主要关注的是工厂设计模式,这是一种创建型设计模式,它提供了创建对象的最佳方式。在这个资料中,可能会详细解释工厂模式的概念、目的以及如何在实际编程中应用。 ...

    工厂方法与抽象工厂设计模式

    工厂方法与抽象工厂设计模式,这份文档介绍了这种设计模式

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    单例设计模式、工厂设计模式和抽象工厂模式是常见的软件开发设计模式。这些设计模式提供了一些有用的思想和实现方式,可以帮助开发人员在设计和实现复杂的软件系统时,更加灵活和高效地进行编程。 单例设计模式是一...

    工厂设计模式附加对象池说明

    本资源包含两部分:工厂设计模式和对象池的设计与实现,主要面向Java开发者。 首先,我们来深入理解工厂设计模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露创建逻辑,同时允许...

    Java 工厂设计模式例题

    例题简单的阐述了Java工厂模式的概念,有利于读者更好地了解Java工厂模式

    工厂设计模式总结

    工厂设计模式是面向对象设计中的一种创建型模式,它的主要目的是为了解耦对象的创建过程,使得客户端代码不再直接通过new关键字创建对象,而是通过一个工厂类来获取所需的对象。这样做的好处在于,当需要添加新的...

    java设计模式中最简单的工厂设计模式的实例

    工厂设计模式是其中最基础且常用的一种,它属于创建型设计模式,主要用于对象的创建。本实例将深入讲解工厂设计模式的概念、结构以及如何在实际项目中应用。 ### 工厂设计模式概述 工厂设计模式的核心思想是定义一...

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

    **Java工厂设计模式之简单工厂** 简单工厂设计模式是一种创建型设计模式,它提供一个创建对象的静态方法,客户端可以通过这个静态方法获取所需的具体产品,而无需了解这些产品的具体实现。这种模式的主要目的是将...

    Seahe工厂设计模式源码 SeaherGongChangMoShi.rar

    《工厂设计模式详解——以Seahe为例》 工厂设计模式是软件工程中一种常见的创建型设计模式,它提供了一种创建对象的最佳方式。在工厂设计模式中,一个工厂类负责创建对象,而客户端则不再直接实例化对象,而是通过...

    三种工厂设计模式和两种单例模式

    在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...

    java工厂设计模式.doc

    【工厂设计模式】是软件开发中常用的设计模式之一,它主要解决的是在代码中如何创建对象的问题,使得创建对象的过程更加灵活,同时也降低了代码之间的耦合。工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和...

Global site tag (gtag.js) - Google Analytics