`

【设计模式】工厂&工厂方法&模板方法

 
阅读更多

工厂:根据不同条件返回不同类型的对象。

 

工厂方法:通过子类复写父类的(抽象)方法,返回具体对象。

 

模板方法:定义通用的程序执行流程,某些不确定的步骤在父类中使用抽象方法进行定义,具体实现交给子类。

 

package pattern.factorymethod;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 工厂
 * 工厂方法
 * 模板方法
 */
public class FactoryMethod {
	public static void main(String[] args) {
		Game game = GameFactory.createGame("Game");
		game.start();
		
		System.out.println("===================================");
		
		Game magicGame = GameFactory.createGame("MagicGame");
		magicGame.start();
	}
	
}

/**
 * 工厂 - Factory
 * 负责创建对象 
 */
class GameFactory {
	public static Game createGame(String gameType) {
		Game game = null;
		
		if(gameType==null) {
			throw new IllegalArgumentException("Game can't be null");
		}
		
		if(gameType.startsWith("Game")) {
			game = new Game();
		}
		
		if(gameType.startsWith("MagicGame")) {
			game = new MagicGame();
		}
		
		return game;
	}
}

class Game {
	private Set<Room> rooms = new HashSet<Room>(); 
	
	public Game() {
		init();
	}
	
	/**
	 * 模板方法
	 * 	通用的流程可以使用模板方法进行定制
	 * 	还可以设置一个钩子,由子类决定哪些步骤是需要的
	 */
	private void init() {
		Room room1 = MakeRoom();
		Room room2 = MakeRoom();
		room1.connect(room2);
		addRoom(room1).addRoom(room2);
	}
	
	private Game addRoom(Room room) {
		rooms.add(room);
		return this;
	}
	
	/**
	 * 工厂方法-Factory Method
	 * 返回一个默认的子类对象。
	 * 另一种常见做法是将其定义为抽象方法。
	 */
	protected Room MakeRoom() {
		return new OrdinaryRoom("OrdinaryRoom"+ThreadLocalRandom.current().nextInt());
	}
	
	public void start() {
		System.out.println("Game start: " + Arrays.toString(rooms.toArray()));
	}
}

abstract class Room {
	String name;
	int capacity = 100;
	abstract void connect(Room otherRoom);
}

class OrdinaryRoom extends Room {
	
	public OrdinaryRoom(String name) {
		super.name = name;
	}
	
	public void connect(Room otherRoom) {
		System.out.println(this.name + " connect to " + otherRoom.name);
	}
	
}

class MagicRoom extends Room {
	public MagicRoom(String name) {
		super.name = name;
		super.capacity = 200;
	}
	public void connect(Room otherRoom) {
		System.out.println(this.name + " connect to " + otherRoom.name);
		System.out.println("Players can see each other with network camera");
	}
	
}

class MagicGame extends Game {

	@Override
	protected Room MakeRoom() {
		return new MagicRoom("MagicRoom"+ThreadLocalRandom.current().nextInt(10));
	}

}

 

分享到:
评论

相关推荐

    工厂模式及模板方法模式深度思考

    在软件设计模式的世界里,工厂模式和模板方法模式是两种常用的设计模式,它们都有各自的优点和应用场景。这两种模式都是面向对象设计原则的体现,能够帮助我们编写出更加灵活、可扩展的代码。让我们来深入探讨一下这...

    设计模式:简单工厂、方法工厂、抽象工厂、单例、原型、委派、模板、代理、策略

    7. **模板方法**:模板方法模式是一种行为设计模式,定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 8. **代理**:代理模式为其他对象提供...

    设计模式之工厂方法、简单工厂、抽象工厂

    工厂方法、简单工厂和抽象工厂是创建型设计模式的三种不同形式,它们都关注于对象的创建过程,但各有其特点和适用场景。 1. **工厂方法(Factory Method)**: 工厂方法模式定义了一个创建对象的接口,但让子类...

    远程抄表与监控仿真系统(Version 1.5,采用策略模式、工厂模式、模板方法模式实现)

    处理层的设计采用了设计模式中的策略模式、模板方法模式和工厂模式。 Server端和Client端的实现也采用了分层的设计方式,包含自定义的模型层、视图层和控制层。 说明:程序采用配置文件的方式进行初始化,运行时时请...

    设计模式(简单工厂和工厂方法C++版)Demo程序

    本Demo程序主要涵盖了两种常用的创建型设计模式——简单工厂模式(Simple Factory)和工厂方法模式(Factory Method)。这两种模式都是用来创建对象,但它们在灵活性和抽象程度上有所不同。 简单工厂模式是一种静态...

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等

    Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子...

    设计模式 工厂方法模式 设计思想 演过过程 重构过程

    工厂方法模式作为其中的一种,属于创建型设计模式,它的主要目标是提供一个接口,用于创建某一类对象的家族,而具体的实例化过程则延迟到子类中进行。这种模式将对象的创建与使用分离,使得系统更加灵活,更具扩展性...

    设计模式——简单工厂 VS 工厂方法

    在软件设计领域,设计模式是解决常见问题的模板,它们为开发者提供了标准的解决方案,以提高代码的可读性、可维护性和复用性。本文将深入探讨两种常见的工厂模式:简单工厂模式和工厂方法模式。 简单工厂模式,也...

    IOS 设计模式抽象工厂实例Demo

    在iOS开发中,设计模式是解决常见编程问题的模板,它们提供了一种标准的方法来组织代码,使得代码更易于理解、扩展和维护。抽象工厂模式是设计模式中的一种,尤其适用于创建一组相关或相互依赖的对象。这个实例Demo...

    qt工厂模式例子qt简单工程模式源码

    参考如下博客,亲自实践了一个QT的工厂模式,亲测可用,编译运行实测。 我用qt5.6,在windows下编译并运行测试,正常。 https://blog.csdn.net/baidu_33570760/article/details/71159808 1. Qt工厂模式源码 2. C++...

    抽象工厂模式+工厂方法模式+策略模式实现手机加工厂

    本案例主要探讨了三种经典的设计模式:抽象工厂模式、工厂方法模式和策略模式,并以手机加工厂为实际应用场景进行阐述。 首先,**抽象工厂模式**是创建型设计模式之一,它提供一个接口,用于创建相关或依赖对象的...

    简单工厂-工厂方法-抽象工厂 对比总结

    在软件设计模式中,工厂模式是一种非常常见的创建型模式,用于封装对象的创建过程,使得客户端无需关注具体的对象实例化细节。本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。...

    设计模式之工厂模式Java实现和类设计图

    在软件开发中,设计模式是经验丰富的开发者们总结出的解决常见问题的模板或最佳实践。工厂模式作为其中的一种,是对象创建型模式,它的主要目的是为了隔离对象创建过程与客户端之间的关系,使得创建过程更加灵活,...

    Java设计模式之工厂方法的工厂方法实现的源码

    工厂方法模式是设计模式中的一员,属于创建型模式,它提供了一种创建对象的最佳方式。这个Java源码示例是关于工厂方法模式的一个具体实现,特别是工厂方法的工厂方法,即二级工厂模式。 工厂方法模式的核心思想是...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    ios 简单工厂设计模式

    在iOS开发中,设计模式是一种解决常见编程问题的模板,它们是经验的总结,能够提高代码的可读性、可维护性和复用性。简单工厂设计模式是其中一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    在软件开发中,设计模式是解决常见问题的模板或最佳实践,它们被广泛应用于Java和其他面向对象编程语言中。以下是对标题和描述中提到的一些关键设计模式的详细解释: 1. **MVC模式(Model-View-Controller)**:这...

    C++ 设计模式:简单工厂、工厂方法、抽象工厂练习代码

    在软件开发领域,设计模式是解决常见问题的模板,它们代表了最佳实践并已被广泛接受。本主题聚焦于C++中的三个工厂模式:简单工厂、工厂方法和抽象工厂。这些模式都围绕着对象的创建过程,旨在提高代码的灵活性、...

    设计模式工厂方法.zip

    《设计模式:工厂方法》 在软件工程领域,设计模式是一种在特定情况下解决常见问题的模板,它描述了在特定上下文中如何重复使用代码来解决问题。"工厂方法"(Factory Method)是设计模式中的一种创建型模式,它提供...

    设计模式课程设计模板

    设计模式课程设计模板通常包括一系列常见的设计模式及其应用实例,帮助学生或开发者系统地学习和掌握这些模式。 在这个"设计模式课程设计模板"中,我们可以期待学习到以下几个主要的知识点: 1. **设计模式分类**...

Global site tag (gtag.js) - Google Analytics