`

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

 
阅读更多

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

 

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

 

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

 

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));
	}

}

 

分享到:
评论

相关推荐

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

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

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

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

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

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

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

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

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

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

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

    深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...

    《Java设计模式》详解

    内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...

    Java23种设计模式可直接运行Demo

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ...

    设计模式自己总结一句话描述

    设计模式分为三大类: 创建型模式,共五种: 工厂方法模式、抽象工厂模式、单例模式、构建者模式、原型模式。 结构型模式,共七种: 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。...

    java常用23中设计模式

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    python设计模式第2版.pdf

    设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计...全书囊括单例设计模式、工厂模式、门面模式、代理模式、观察者模式、命令模式、模板方法模式、复合模式、状态设计模式以及反模式等多种设计模式。

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    Java代码积累:并发 设计模式 数据结构 使用容器 实用 类 基础知识 并发性 演示线程的生命周期 生产者-消费者 设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者...

    设计模式-C++

    创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...

    23种JAVA设计模式和15种J2EE设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ...

    设计模式的精简版

    java设计模式的精简版,创建型模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式共五种; 结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式共七种。 行为型...

    java设计模式示例

    java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    logo 1工厂模式:一个接口封装更多接口工厂模式:一个接口封装更多接口 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第2页。 2桥接模式:定义一个接口、两个类都实现该接口桥接模式:...

    设计模式-工厂方法模式(讲解及其实现代码)

    设计模式-工厂方法 讲解及其源码

    23种设计模式实例

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

Global site tag (gtag.js) - Google Analytics