首页 > 其他分享 >一个实例用全创建型模式

一个实例用全创建型模式

时间:2024-12-10 16:31:13浏览次数:5  
标签:IOperation exe 创建 void class 用全 实例 new public

  目录《一个实例讲完23种设计模式》

当前:单件+抽象工厂+创建者+工厂方法

需求:坦克大战

创建两种坦克

坦克类型射程速度
b7070米时/70公里
b5050米时/50公里

设计说明

1.抽象工厂(AbstractFActory)承担了创建部件的任务

2.创建者(IBuilder)承担了讲部件组装的任务

3.工厂方法(IFactory)类相当于创建者模式的导演,但是他是并未给用户提供选择创建者的接口。

而是通过自己的多态来实现加载不同的创建者。

类图

代码

//-------功能类-------------------
//功能基类
class Function{
	public String mOperation;
	public void exe(int type) {
		System.out.println(mOperation+type);
	}
};
//射击类
class ShotFun extends Function{
	static ShotFun mFunction = new ShotFun();
	static ShotFun get() {
		return mFunction;
	}
	public ShotFun() {
		mOperation = "射击:";
	}
}
//行走类
class RunFun extends Function{
	static RunFun mFunction = new RunFun();
	static RunFun get() {
		return mFunction;
	}
	public RunFun() {
		mOperation = "跑:";
	}
}
//====== interface 接口和抽象类 ========================
interface ITank{
	void shot();
	void run();
	void setmShot(IOperation mShot);
	void setmRun(IOperation mRun);
}
interface IOperation{
	void exe();
}
interface IAbstractFactory{
	IOperation createShot();
	IOperation createRun();
}
interface IBuilder{
    //给坦克安装发射功能
	void createShout(ITank t);
    //给坦克安装行走
	void createRun(ITank t);
}
interface IFactory{
	ITank createTank();
}
//====== 实装类如下 ========================
//------功能类-----------------------------
//70的发射功能
class Shot70 implements IOperation{
	public void exe() {
		ShotFun.get().exe(70);
	}
}
//70的行走功能
class Run70 implements IOperation{
	public void exe() {
		RunFun.get().exe(70);
	}
}
//50的发射功能
class Shot50 implements IOperation{
	public void exe() {
		ShotFun.get().exe(50);
	}
}
//50的行走功能
class Run50 implements IOperation{
	public void exe() {
		RunFun.get().exe(50);
	}
}
class Tank implements ITank{
	IOperation mShot;
	IOperation mRun;
	int mSubType;
	public void setmSubType(int mSubType) {
		this.mSubType = mSubType;
	}
	public void setmShot(IOperation mShot) {
		this.mShot = mShot;
	}
	public void setmRun(IOperation mRun) {
		this.mRun = mRun;
	}
	public void shot() {
		mShot.exe();
	}
	public void run() {
		mRun.exe();
	}
}
//---------抽象工------------------------------------------
//抽象工厂-70
class AbstractFactory70 implements IAbstractFactory{
	public IOperation createShot() {
		return new Shot70();
	}
	public IOperation createRun() {
		return new Run70();
	}
}
//抽象工厂-50
class AbstractFactory50 implements IAbstractFactory{
	public IOperation createShot() {
		return new Shot50();
	}
	public IOperation createRun() {
		return new Run50();
	}
}
//---------------创建者-----------------------------------
//创建者
abstract class Builder implements IBuilder{
	IAbstractFactory mIAbstractFactory;
	public void createShout(ITank t) {
		t.setmShot(mIAbstractFactory.createShot());
	}
	public void createRun(ITank t) {
		t.setmRun(mIAbstractFactory.createRun());
	}
}
//创建者-70
class Builder70 extends Builder{
	public Builder70() {
		mIAbstractFactory = new AbstractFactory70();
	}
}
//创建者-50
class Builder50 extends Builder{
	public Builder50() {
		mIAbstractFactory = new AbstractFactory50();
	}
}
//----------工厂方法------------------------------------------
//工厂方法
abstract class Factory implements IFactory{
	IBuilder mBuilder;
	public ITank createTank() {
		ITank t = new Tank();
		mBuilder.createRun(t);
		mBuilder.createShout(t);
		return t;
	}
}
//工厂方法-70
class Factory70 extends Factory{
	public Factory70() {
		mBuilder = new Builder70();
	}	
}
//工厂方法-50
class Factory50 extends Factory{
	public Factory50() {
		mBuilder = new Builder50();
	}
}
//主程序入口
public class Client {
	public static void main(String[] args) {
		System.out.println("hello worldff !");
		Factory70 f7 = new Factory70();
		ITank t = f7.createTank();
		t.shot();
		t.run();
	}
}

运行结果

下一篇:一个实例用全创建型模式-优化(冗余消除)-CSDN博客

标签:IOperation,exe,创建,void,class,用全,实例,new,public
From: https://blog.csdn.net/xie__jin__cheng/article/details/144377140

相关文章

  • 这么回答Java对象创建过程, 面试官给我一个赞
    一、对象的组成对象的组成包含三部分:对象头、实例数据、对齐填充。1.对象头Java的对象头由以下三部分组成:MarkWord、指向类的指针、数组长度(只有数组对象才有)①MarkWordMarkWord包含:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64bit)。Mar......
  • 使用js如何创建一个private方法?
    在JavaScript中,没有真正的私有方法的关键字(像Java或C#中的private)。但是,有几种方法可以实现类似私有方法的行为,提供不同程度的封装和安全性。1.使用Symbol作为属性名:这种方法利用Symbol的唯一性来创建“私有”属性,从而间接地创建“私有”方法。虽然技术上仍然可以访问,但这种方......
  • C++链表的创建与基本操作
    在C++中,链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表具有灵活的内存管理和高校的插入与删除操作,但访问效率较低。链表的每个节点通常包含两部分:1、数据部分(存储链表中元素的数据);2、指针部分(指向链表中的下一个节点)。链表类型主......
  • 学生信息数据库的创建
    需求分析学生信息数据库用来存储学生的一些相关信息,其中包括学生所在院系,学生基础信息,老师信息表,学生总成绩,学生各学科成绩,专业课基础信息。并构建不同的用户使其各自分配不同的权限,对整个数据库进行维护。例如:班主任进行学生总成绩的维护,各科老师对各科成绩表以及专业基础表......
  • 什么是反向代理?作用、原理和实例详解
    ......
  • IDApython使用全局变量
    在使用IDApython时,经常会苦恼IDApython中的条件断点运行一次过后变量就会重置,描述的不严谨,具体情形如下:foriinrange(10,20): print(i)假如我在print(i)中下断点:我想要当i增加三次后就停下,我可以这样写ea=get_reg_value("eax")ifea==13: print("stophere!")但是......
  • Spring源码分析之Bean的创建过程(createBean)
    前言: 通过Spring源码分析之doGetBean()-CSDN博客的学些我们知道了如何获得Bean但是我们看完就知道这个Bean是从缓存中获得的如果不能从缓存中获得的话那么就会进行创建,这个创建Bean的是一个很重要的一部分如果这一篇文章的话要好好学习。加油加油!!!!CreateBean(): ......
  • Linux基础——创建本地yum源目录及同步公网yum源repo目录到本地
    一、检查同步在线yum源repo源所有rpm包的占用大小yumrepolistAppStream-v 二、下载带目录bclinux/el8.2/,下载目录下除iso及index的目录及文件wget-r-np-nH-Riso,index.html*https://mirrors.cmecloud.cn/bclinux/el8.2/不带目录结构下载wget-nd-r-l1-A.rpm......
  • Python基础——创建虚拟环境
    一、准备工具1、python3.7、pip3.7安装参考:https://www.cnblogs.com/gkhost/p/185950212、pip3更换源#永久设定pip3源pipconfigsetglobal.index-urlhttps://mirrors.huaweicloud.com/repository/pypi/simplepipconfigsetglobal.index-urlhttp://mirrors.aliyun.com......
  • Redis单实例安装
    Redis单实例安装Redis(RemoteDictionaryServer)是一个开源的内存数据库,遵守BSD协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。性能极高:Redis以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理高并发......