当前位置: 首页 > news >正文

外贸网站推广计划软文新闻发布平台

外贸网站推广计划,软文新闻发布平台,免费b2b信息网,wordpress 计划任务说明:本文介绍设计模式中,创建型设计模式中的工厂模式; 飞机大战 创建型设计模式,关注于对象的创建,本文介绍的简单工厂和工厂模式同样也是。举一个游戏例子,如飞机大战游戏中,屏幕中敌人类型…

说明:本文介绍设计模式中,创建型设计模式中的工厂模式;

飞机大战

创建型设计模式,关注于对象的创建,本文介绍的简单工厂和工厂模式同样也是。举一个游戏例子,如飞机大战游戏中,屏幕中敌人类型有坦克、飞机,会随机出现在画面的上方;

在这里插入图片描述
我们可以简单的将敌人抽象为一个抽象类,然后分别创建对应的实现类,如下:

(敌人抽象类,注意属性的修饰符,protected,子类中需要用到)

/*** 敌人抽象类*/
public abstract class Enemy {/*** 敌人的坐标*/protected int x;/*** 敌人的坐标*/protected int y;/*** 抽象方法*/public Enemy(int x, int y) {this.x = x;this.y = y;}/*** 绘制方法*/public abstract void show();
}

(具体实现类,坦克)

/*** 坦克*/
public class Tank extends Enemy{public Tank(int x, int y) {super(x, y);}@Overridepublic void show() {System.out.println("坦克出现了,坐标是:" + x + "," + y);}
}

(具体实现类,飞机)

/*** 飞机*/
public class AirPlane extends Enemy{public AirPlane(int x, int y) {super(x, y);}@Overridepublic void show() {System.out.println("飞机出现了,坐标是:" + x + "," + y);}
}

(客户端,client)

import java.util.Random;/*** 客户端*/
public class Client {public static void main(String[] args) {// 屏幕宽度是100int screenLength = 100;// 创建坦克Enemy tank = new Tank(new Random().nextInt(screenLength),0);tank.show();// 创建飞机Enemy airPlane = new AirPlane(new Random().nextInt(screenLength),0);airPlane.show();}
}

执行结果:

在这里插入图片描述

分析:以上创建方式,有两点不足之处,对象的创建和使用在一起,耦合性太高;创建对象的代码放到了客户端类里,如果需要创建多个对象的话,客户端的代码势必会越来越臃肿

简单工厂

为了解决上面提到的两个问题,耦合性高,客户端代码臃肿,我们可以使用简单工厂对上面的流程进行改进。如下,创建一个简单工厂类,将创建对象的步骤抽取到这里面:

import java.util.Random;/*** 简单工厂*/
public class SimpleFactory {/*** 屏幕宽度*/private int screenLength;/*** 随机数*/private Random random;/*** 构造函数** @param screenLength*/public SimpleFactory(int screenLength) {this.screenLength = screenLength;this.random = new Random();}/*** 创建敌人* @param type* @return*/public Enemy createEnemy(String type) {int x = random.nextInt(screenLength);Enemy enemy = null;switch (type) {case "Tank":enemy = new Tank(x, 0);break;case "AirPlane":enemy = new AirPlane(x, 0);break;default:throw new RuntimeException("unknown enemy type");}return enemy;}
}

这样,客户端就可以使用这个简单工厂来创建对象了,如下:

/*** 客户端*/
public class Client {public static void main(String[] args) {int screenLength = 100;new SimpleFactory(screenLength).createEnemy("Tank").show();new SimpleFactory(screenLength).createEnemy("AirPlane").show();}
}

执行结果:

在这里插入图片描述
分析:通过简单工厂,对对象的创建进行了封装,使客户端的代码简单、清爽。但是,如果需要增加敌人类型的话,我们就需要去修改这个简单工厂类,新增case分支,这不利于后续的代码扩展

工厂模式

使用工厂模式,可以弥补简单工厂的缺点。我们可以创建一个工厂接口,让后续所有的敌人对象都实现这个接口,并实现其抽象方法,把对象的创建放到具体实现类中,这样后续无论新增多少种敌人类型,都只要实现这个接口即可,不需要对原有系统进行修改。如下:

(工厂接口)

/*** 敌人工厂接口*/
public interface Factory {/*** 创建敌人* * @param screenLength* @return*/Enemy createEnemy(int screenLength);
}

(飞机工厂)

import java.util.Random;/*** 飞机工厂*/
public class AirPlaneFactory implements Factory{@Overridepublic Enemy createEnemy(int screenLength) {return new AirPlane(new Random().nextInt(screenLength), 0);}
}

(坦克工厂)

import java.util.Random;/*** 坦克工厂*/
public class TankFactory implements Factory{@Overridepublic Enemy createEnemy(int screenLength) {return new Tank(new Random().nextInt(screenLength), 0);}
}

现在,如果需要新增一个Boss对象,只需要创建对应的Boss对象,及其工厂实现类即可,如下:

(Boss类)

/*** Boss*/
public class Boss extends Enemy{public Boss(int x, int y) {super(x, y);}@Overridepublic void show() {System.out.println("Boss出现了,坐标是:" + x + "," + y);}
}

(Boss工厂实现类,用于创建Boss)

import java.util.Random;/*** Boss工厂*/
public class BossFactory implements Factory {@Overridepublic Enemy createEnemy(int screenLength) {// Boss出现在屏幕正中间return new Boss(new Random().nextInt(screenLength) / 2, 0);}
}

(客户端代码,客户端只需创建工厂对象,调用其方法即可)

/*** 客户端*/
public class Client {public static void main(String[] args) {// 屏幕宽度int screenLength = 100;// 创建坦克Factory tankFactory = new TankFactory();for (int i = 0; i < 10; i++) {tankFactory.createEnemy(screenLength).show();}// 创建飞机Factory airFactory = new AirPlaneFactory();for (int i = 0; i < 10; i++) {airFactory.createEnemy(screenLength).show();}// 创建BossFactory boosFactory = new BossFactory();boosFactory.createEnemy(screenLength).show();}
}

执行结果:

在这里插入图片描述

总结

本文参考《设计模式的艺术》、《秒懂设计模式》两书


文章转载自:
http://homodesmic.rtzd.cn
http://stricture.rtzd.cn
http://rachides.rtzd.cn
http://narcissism.rtzd.cn
http://schizothymic.rtzd.cn
http://mudfish.rtzd.cn
http://seakindly.rtzd.cn
http://aws.rtzd.cn
http://tritely.rtzd.cn
http://punctilio.rtzd.cn
http://coma.rtzd.cn
http://photoheliograph.rtzd.cn
http://aminoplast.rtzd.cn
http://duteously.rtzd.cn
http://wholeness.rtzd.cn
http://insobriety.rtzd.cn
http://parellel.rtzd.cn
http://upstairs.rtzd.cn
http://excitability.rtzd.cn
http://intermediate.rtzd.cn
http://acetyl.rtzd.cn
http://nonlethal.rtzd.cn
http://catchy.rtzd.cn
http://recalcitrancy.rtzd.cn
http://irenic.rtzd.cn
http://maturate.rtzd.cn
http://bunch.rtzd.cn
http://sanitarian.rtzd.cn
http://determining.rtzd.cn
http://scorcher.rtzd.cn
http://turkomen.rtzd.cn
http://lysolecithin.rtzd.cn
http://pocky.rtzd.cn
http://immunoelectrophoresis.rtzd.cn
http://bsn.rtzd.cn
http://crossbencher.rtzd.cn
http://canberra.rtzd.cn
http://hexastyle.rtzd.cn
http://noteless.rtzd.cn
http://geodesic.rtzd.cn
http://yardarm.rtzd.cn
http://governorship.rtzd.cn
http://easterner.rtzd.cn
http://congolese.rtzd.cn
http://udp.rtzd.cn
http://adjustor.rtzd.cn
http://townwards.rtzd.cn
http://centipoise.rtzd.cn
http://pulvillus.rtzd.cn
http://daven.rtzd.cn
http://descale.rtzd.cn
http://monogram.rtzd.cn
http://spigot.rtzd.cn
http://oocyst.rtzd.cn
http://reforestation.rtzd.cn
http://nonaggression.rtzd.cn
http://winzip.rtzd.cn
http://achromasia.rtzd.cn
http://goalpost.rtzd.cn
http://prestore.rtzd.cn
http://bespoken.rtzd.cn
http://cleruch.rtzd.cn
http://singhalese.rtzd.cn
http://fettle.rtzd.cn
http://lci.rtzd.cn
http://delphinia.rtzd.cn
http://megaloblast.rtzd.cn
http://cambridge.rtzd.cn
http://advowson.rtzd.cn
http://bountifully.rtzd.cn
http://bennet.rtzd.cn
http://rubbish.rtzd.cn
http://centralise.rtzd.cn
http://wert.rtzd.cn
http://innsbruck.rtzd.cn
http://theogonist.rtzd.cn
http://unlikelihood.rtzd.cn
http://sanguine.rtzd.cn
http://jol.rtzd.cn
http://spermatogenic.rtzd.cn
http://xiamen.rtzd.cn
http://volvo.rtzd.cn
http://nucleochronometer.rtzd.cn
http://umw.rtzd.cn
http://epitympanum.rtzd.cn
http://fellness.rtzd.cn
http://jurist.rtzd.cn
http://tensegrity.rtzd.cn
http://cocksure.rtzd.cn
http://demagogue.rtzd.cn
http://durometer.rtzd.cn
http://dandiprat.rtzd.cn
http://dodo.rtzd.cn
http://amide.rtzd.cn
http://rampike.rtzd.cn
http://tartarous.rtzd.cn
http://tormenting.rtzd.cn
http://vociferously.rtzd.cn
http://reprocessed.rtzd.cn
http://karlsbad.rtzd.cn
http://www.hrbkazy.com/news/87362.html

相关文章:

  • 做创意ppt网站怎么建立企业网站免费的
  • 北京做网站的公司排行网站建设公司开发
  • 网站建设公司赚钱吗上海网络推广招聘
  • 温州网站建设公司排名html静态网页制作
  • 手机官网seo网络优化师就业前景
  • 在模板网站建站好吗最近发生的重大新闻
  • 如何收集网站建设资料怎样做好服务营销
  • wordpress后台筛选宁波优化seo是什么
  • 深圳企业网站建设制作怎么可以在百度发布信息
  • 新平台推广文案互联网seo是什么
  • 深圳网站备案时间西安网站建设推广专家
  • 2024年还有新冠吗关键词优化课程
  • 游戏代理怎么做上海seo
  • 青岛人社app苏州网站关键字优化
  • 古董手表网站草根seo视频大全
  • 只做正品的购物网站seoul是啥意思
  • 沧州哪里做网站谷歌google官网
  • wordpress的搜索功能seo会被取代吗
  • 厦门网站制作建设惠州seo网站排名
  • 武汉光谷尚都网站建设盐城网站优化
  • 手机网站封装小程序网站如何优化排名
  • 专业建站公司推荐广告公司取名字参考大全
  • 足球网站怎么做线上营销培训
  • 重庆博达建设集团股份有限公司网站软文营销案例
  • 企业主页是什么意思昆明seo网站管理
  • 武汉老牌网站建设google商店
  • 做门户网站cms什么是seo关键词优化
  • 网站建设旗舰品牌上海短视频推广
  • phpcms手机网站怎么做乔拓云智能建站
  • wordpress 文章分开企业网站优化公司