1.题目分析
简单工厂模式:首先定义一个Nvwa的接口,里面定义一个show()的抽象方法。再定义Man、Woman和Robot三个类分别继承Nvwa这个接口,并重写show()方法。再定义一个creatfactory类,与Man、Woman、Robot类有关联。通过传入的参数,给相应的类产生了相应的对象并返回该对象
工厂方法模式:首先定义一个airConditioner的接口,定义一个Play的抽象方法,再定义HaierAirConditioner类和HMideaAirConditioner类分别继承上面那个接口,重写Play()方法。再定义一个工厂类的接口,分别为Haier和HMidea定义俩个具体的工厂类,然后具体的工厂类和具体的产品类产生关联。
抽象工厂模式:先定义个内存和CPU的接口,内存接口中有个used()方法,CPU接口中有个work()方法。然后定义Pc内存类,Mac内存类,都继承内存这个接口。再定义PcCPU类和MacCPU类,都继承CPU接口。再定义一个工厂的接口,里面有 Memory和CPU方法,然后定义Pc工厂类和Mac工厂类,重写俩个方法,然后对应的和上边的具体产品类进行关联

2.类图设计:
简单工厂模式

工厂方法模式

抽象工厂模式

3.程序实现
简单工厂模式:
package moshi1;

import java.util.Scanner;

interface Nvwa {//抽象父类
public void show();
}

class Man implements Nvwa {//男人类继承父类
public void show() {//重写show()方法
System.out.println(“返回一个Man的对象”);
}
}

class Woman implements Nvwa {//女人类继承父类
public void show() {
System.out.println(“返回一个Woman的对象”);
}
}

class Robot implements Nvwa {//机器人类继承父类
public void show() {
System.out.println(“返回一个Robot的对象”);
}
}

class creatfactory {
public Nvwa creat(String n) {
if (n.equals(“M”)) {
Nvwa m = new Man();//产生一个Man类的对象并返回
return m;
} else if (n.equals(“W”)) {
Nvwa w = new Woman();
return w;
} else if (n.equals(“R”)) {
Nvwa r = new Robot();
return r;
}
return null;
}
}

public class Moshi1 {
public static void main(String[] args) {
System.out.println(“请输入你要传的参数(M or W or R)”);
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
creatfactory c=new creatfactory();
c.creat(s).show();//通过返回的对象调用对应的show()方法
}

}

工厂方法模式:

package moshi2;

import java.util.Scanner;

interface airConditioner {//空调接口
public void Play();
}

class HaierAirConditioner implements airConditioner {//海尔空调继承空调接口
public void Play() {//重写Play()方法
System.out.println(“海尔空调正在运行中”);
}
}

class MideaAirConditioner implements airConditioner {//美的空调继承空调接口
public void Play() {
System.out.println(“美的空调正在运行中”);
}
}

interface Factory2 {//工厂接口
public airConditioner producAirConditioner();//返回一个空调的对象
}

class HaierFactory2 implements Factory2 {//海尔工厂继承工厂接口
public airConditioner producAirConditioner() {
return new HaierAirConditioner();//返回一个海尔空调的对象
}
}

class MideaFactory2 implements Factory2 {//美的工厂继承工厂接口
public airConditioner producAirConditioner() {
return new MideaAirConditioner();//返回一个美的空调的对象
}
}
public class Moshi2 {
public static void main(String[] args) {
System.out.println(“请输入要运行空调的品牌(Haier or Mide)”);
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
if(str.equals(“Haier”)) {
new HaierFactory2().producAirConditioner().Play();
}else if(str.equals(“Mide”)) {
new MideaFactory2().producAirConditioner().Play();
}
}
}

抽象工厂模式:

package moshi3;

import java.util.Scanner;

interface computerMemory{//内存接口
public void used();
}

class PcComputerMemory implements computerMemory{//Pc电脑内存继承内存接口
public void used() {
System.out.println(“Pc电脑的内存正在被使用中”);
}
}

class MaccomputerMemory implements computerMemory{//Mac电脑内存继承内存接口
public void used() {
System.out.println(“Mac电脑的内存正在被使用中”);
}
}

interface computerCPU{//CPU接口
public void work();
}

class PcComputerCPU implements computerCPU{//Pc电脑CPU继承CPU接口
public void work() {
System.out.println(“Pc电脑CPU正在工作中”);
}
}

class MacComputerCPU implements computerCPU{//Mac电脑CPU继承CPU接口
public void work() {
System.out.println(“戴尔电脑CPU正在工作中”);
}
}

interface factory{//工厂接口
public computerMemory Memory();//内存方法
public computerCPU CPU();//CPU方法
}

class PcFactory implements factory{//Pc工厂继承工厂接口
public computerMemory Memory() {
return new PcComputerMemory();//返回相应的对象
}
public computerCPU CPU() {
return new PcComputerCPU();
}
}

class MacFactory implements factory{//Mac工厂继承工厂接口
public computerMemory Memory() {
return new MaccomputerMemory();
}
public computerCPU CPU() {
return new MacComputerCPU();
}
}
public class Moshi3 {
public static void main(String[] args) {
System.out.println(“请输入要生产的电脑(Pc or Mac)”);
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
if(str.equals(“Pc”)) {
factory hp=new PcFactory();
hp.Memory().used();
hp.CPU().work();
}
else if(str.equals(“Mac”)) {
factory dl=new MacFactory();
dl.Memory().used();
dl.CPU().work();

 }
}

}

4.调试、测试、及运行结果:
简单工厂模式的运行结果;

工厂方法模式的运行结果:

抽象工厂模式的运行结果:

5.经验归纳:
通过编写三种模式的代码,发现了各种模式的优缺点:
简单工厂的优点:实现了对象创建和使用的分离,无须知道具体产品类的类名,在不修改任何客户端代码的情况下跟新和增加新的具体产品类
缺点:工厂类的责任过重,系统扩展困难,造成工厂角色无法形成基于继承的等级结构
工厂方法模式优点:向客户端隐藏了那种具体产品类能被实例化这一细节。能够让工厂自主确定创建何种产品对象,完全符合开闭原则
缺点:类的个数将成对增加,增加了系统的抽象性和理解难度
抽象工厂模式优点:隔离了具体类的生成,能够保证客户端始终只使用一个产品族中的对象。增加新的产品族很方便,符合开闭原则
缺点:增加新的产品等级结构麻烦。

简单工厂模式,工厂方法模式,抽象工厂方法的具体实现相关推荐

  1. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

  2. C++设计模式 | Factory工厂模式(简单工厂、工厂方法、抽象工厂)

    目录 简单工厂 工厂方法 抽象工厂 学习工厂模式需要有C++虚函数 纯虚函数等相关继承与多态知识 简单工厂 在简单工厂模式中,可以根据参数的不同返回不同的实例..简单工厂模式专门定义一个类来负责创建其 ...

  3. 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式

    创建型模式-工厂三兄弟 提示:个人学习总结,如有错误,敬请指正 文章目录 创建型模式---工厂三兄弟 一.简单工厂模式 1.简单工厂模式是什么? 2.UML图 3.实现方式 二.工厂(方法)模式 1. ...

  4. 工厂模式之简单工厂、工厂方法、抽象工厂分析对比

    工厂模式有三种分类,简单工厂(也叫静态工厂).工厂方法模式.抽象工厂 一.简单工厂 简单工厂通俗的说就是提供一个类,这个类中的某个方法根据入参的不同来创建并返回实现了同一个接口的不同具体子类(产品). ...

  5. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  6. C++工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式 前言 为什么要使用工厂模式 优点 缺点 简单工厂(Simple Factory) 代码 应用 不足 工厂方法(Factory Method) 代码 应用 不足 抽象工厂(Abstract F ...

  7. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  8. 23招做项目——工厂模式:工厂方法和抽象工厂

    在网上的大多数资料里面,将工厂模式分为:简单工厂.工厂方法.抽象工厂,他们之间的联系(以电子厂为例)如下: 那么该文章首先讲解工厂模式是什么,为什么需要工厂模式,最后再对三种模式进行示例.该文章是23 ...

  9. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  10. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

最新文章

  1. 参考答案:03 向量空间
  2. 【Python】Matplotlib 可视化必备神书,附pdf下载
  3. python类class基础
  4. java学习笔记16--异常
  5. windows rt c语言,有arm架构的windows平板吗??与x86的win有什么不同?arm写c语言怎样?
  6. 42. Understand the two meanings of typename.
  7. android 3gpp 播放,Android Market:MoboPlayer 最強悍的免費影片播放程式
  8. python qt教程视频 下载_Qt基础课程视频教程 教学视频 百度网盘下载
  9. 怎么把音频合并在一起?
  10. 旧历九月十六是老爸的生日,现在我才晓得
  11. oracle根据身份证号码计算年龄
  12. sqlite只能用于android系统,android SQLite
  13. 发热内衣的优势在哪里
  14. 白光模块?彩光模块?
  15. 孩子发烧是细菌感染还是病毒感染?教你秒懂血常规!
  16. oracle命名规则
  17. 自定义View基础:Android中的颜色和颜色混合
  18. 火线,零线,地线各自颜色和作用(转载)
  19. 日志易之AIX、HP-UNIX小机探针Agent安装步骤
  20. 编写bat命令打开文件夹或者doc,txt文件

热门文章

  1. c++整人程序(2)
  2. uni app和php开发微信登录代码,uniapp如何实现微信授权登录
  3. 茴香斋主《潭柘钟声》
  4. realsense d435 刷固件后连接失败问题
  5. Python爬虫——利用PhantomJS下载动态加载图片
  6. iOS13中iPhoneX系统UITableViewCell右箭头
  7. 电脑版微信防撤回怎么设置?
  8. windows下plink的常用命令
  9. 无法连接到服务器,请您检查网络连接 阴阳师桌面版
  10. Vue引入Udesk在线打电话组件