首页 > 编程语言 >简单工厂模式--Java实现+C++实现

简单工厂模式--Java实现+C++实现

时间:2023-10-13 15:46:26浏览次数:67  
标签:Woman Java -- System C++ Robot Person public Man

问题描述

使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。

问题实现

starUML画的相应的类图:

然后就是代码实现:

Java代码实现

在Java里面,Person类相当于一个接口;

Man、Woman、Robot类相当于接口的实现类;

NvWa里面定义造人的函数方法;

Main里面定义进入程序的接口;

//Person.java
package org.example;

public interface Person {
    public void say();
}

//Man.java
package org.example;

public class Man implements Person{
    @Override
    public void say() {
        System.out.println("我是一个Man");
    }
}

//Woman.java
package org.example;

public class Woman implements Person{
    @Override
    public void say() {
        System.out.println("我是一个Woman");
    }
}

//Robot.java
package org.example;

public class Robot implements Person{
    @Override
    public void say() {
        System.out.println("我是一个Robot");
    }
}

//NvWa.java
package org.example;

public class NvWa {
    public static Person createPerson(String a) throws Exception {
        if(a.equals("M")){
            System.out.println("女娲创造了一个Man");
            return new Man();
        }else if(a.equals("W")){
            System.out.println("女娲创造了一个Woman");
            return new Woman();
        }else if(a.equals("R")){
            System.out.println("女娲创造了一个Robot");
            return new Robot();
        }else{
            throw new Exception("女娲并不能创造意料之外的人");
        }
    }
}

//Main.java
package org.example;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc=new Scanner(System.in);

        System.out.println("请选择:男人-M;女人-W;机器人-R");
        //输入一个字符,用于比较要执行哪个类
        String a=sc.next();

        Person p=NvWa.createPerson(a);

        p.say();
    }
}

C++代码实现(发现一个很严重的问题,Java写多了,C++语法有点儿忘记了~~~)

在C++里面,Person类相当于抽象产品类;

Man、Woman、Robot类相当于具体产品类;

NvWa相当于工厂类;

Main相当于测试类,进入程序的接口;

#pragma once

#include <iostream>
using namespace std;

class Person
{
public:
	virtual void say() = 0;
};


class Man :public Person {
public:
	void say() {
		cout << "我是一个Man" << endl;
	}
};

class Woman :public Person {
public:
	void say() {
		cout << "我是一个Woman" << endl;
	}
};

class Robot :public Person {
public :
	void say() {
		cout << "我是一个Robot" << endl;
	}
};

class NvWa {
public:
	Person *createPerson(string a) {
		if (a.compare("M")==0) {
			cout << "女娲创造了一个Man" << endl;
			return new Man();
		}
		else if (a.compare("W")==0) {
			cout << "女娲创造了一个Woman" << endl;
			return new Woman();
		}
		else if (a.compare("R")==0) {
			cout << "女娲创造了一个Robot" << endl;
			return new Robot();
		}
		else {
			cout << "女娲并不能创造意料之外的人" << endl;
			throw new exception("女娲并不能创造意料之外的人");
		}

	}
};

int main() {
	cout << "请选择:男人-M;女人-W;机器人-R" << endl;
	string s;
	cin >> s;

	Person* p;

	NvWa* q = new NvWa();
	p = q->createPerson(s);
	p->say();

	return 0;
}

标签:Woman,Java,--,System,C++,Robot,Person,public,Man
From: https://www.cnblogs.com/liuzijin/p/17761905.html

相关文章

  • 开课吧前端1期.阶段4-1:Markdown,git
    Markdown工具:1.markdown——程序员专用,写笔记文档(建议)Atom工具插件:MarkdownPreviewPlus*使用方法#一级标题##二级标题###三级标题-列表(零序列表)```代码```sql代码---代表一条线|---|表格 版本控制国外:github国内:gitee.com公司开发都是多人......
  • EndNote 21:文献与论文管理的智能化解决方案 Mac+win版
    EndNote21是一款在学术界被广泛使用的文献和论文管理软件,帮助用户轻松高效地组织、引用、分析和分享文献资源。→→↓↓载EndNote21mac/win版 EndNote21具有强大的文献搜索和导入功能,可以方便地从各大数据库、Web资源和其他EndNote用户共享的文献库中导入所需文献。同时,它......
  • Linux服务器初始化
    1、服务器初始化sed-i"s/SELINUX=enforcing/SELINUX=disabled/g"/etc/selinux/configrm-rf/etc/yum.repos.d/*#配置yumcurl-o/etc/yum.repos.d/Centos-7.repohttp://mirrors.aliyun.com/repo/Centos-7.repocurl-o/etc/yum.repos.d/epel.repohttp://mirrors.......
  • 将java程序,安装为windows服务,开机自启动
    借助WindowsServiceWrapper小工具,将java程序转换为Windows服务,在服务中心配置自启动,从而在开机时windows自行启动服务。WindowsServiceWrapper下载URL:https://github.com/winsw/winsw/releases如下图,为windows32位和64位的工具文件 32位:链接: https://pan.baidu.co......
  • 本地有多个node切换不同版本node方法
    1.在当前使用的node版本,进行你要切换node版本的设置和配置npmconfigsetprefix"F:\node14\node_global"npmconfigsetcache"F:\node14\node_cache"假如你当前使用的是node14,这里就写node18,当前使用的是node18,这里就写node14。当然具体的路径名称根据你本地安装路径来配......
  • 单例模式
    如题Java中单例模式的使用有很多方法1.懒汉式,饿汉式,等等用到哪个整理哪个懒汉式饿汉式双检查privatestaticCameraPhotographPresentersInstance;privateCameraPhotographPresenter(){}publicstaticCameraPhotographPresentergetInstance(){if(sInstance=......
  • OSError: [Errno 28] No space left on device的原因总结
    简单总结下碰到这个问题可能的原因:最常见的,就是磁盘空间真的满了,这个时候你只能rm一些不需要的文件来解决问题还有可能是inode不足了,这个跟磁盘当初是怎么格式化的有关,如果有太多细碎文件确实有可能出现明明还有空间但是inode却用完了的情况。可以通过df-ih来查看inode使用......
  • burpsuite靶场----目录遍历----绝对路径
    burpsuite靶场----目录遍历----绝对路径靶场地址https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass正式开始1.随便打开一个图片2.然后filename先尝试./../../../../etc/passwd不行然后再尝试/etc/passed成功......
  • Codeforces Round 685 (Div. 2) B. Non-Substring Subsequence
    对于一个长为\(n\)的\(01\)字符串\(s\)有\(n\)个询问。第\(i\)个询问被\(l_i,r_i\)描述\(1\leql_i<r_i\leqn\)。对于每个询问,你需要确定\(s\)中是否存在一个子序列等同于子串\(s[l_i\cdotsr_i]\)。显然子序列可以和子串仅有一个字符不相同。于是\(s......
  • Gym100078F Formula
    非常好,竟然是有思维的模拟题。换句话讲就是有模拟的思维题题意:给定一个由与或非组成的逻辑表达式,你需要把他化简成一个变量不重复的与或非逻辑表达式或报告无解。发现如果允许变量重复了,这个逻辑表达式没有什么性质,任何一种真值表都可以通过合适的构造得来。所以题目相当于直接......