- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章一篇文章带你入门java工厂模式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象.
简单编写一个类:
本程序非常简单就是通过接口的子类为接口对象实例化,但是本操作存在什么样的问题呢?
之前一直在强调,主方法或者是主类是一个客户端,客户端的操作应该越简单越好。但是在现在的程序之中,有一个最大的问题:客户端之中,一个接口和一个固定的子类绑在一起了.
在本程序之中,最大的问题在于耦合上,发现在主方法之中一个接口和一个子类紧密耦合在一起,这种方法比较直接,可以简单的理解为:A→B,但是这种紧密的方式不方便于维护,所以后来使用了A→B→C,中间经历了一个过渡,这样一来B去改变,C去改变,但是A不需要改变,就好比JAVA的JVM一样:程序→JVM→操作系统.
ProjectFactory.java 。
public interface ProjectFactory { Project getname();}
BlueFactory.java(ConcreteFactory1) 。
public class BlueFactory implements ProjectFactory{ @Override public Project getname() { // TODO Auto-generated method stub return new Bluepen(); }}
RedFactory.java(ConcreteFactory2) 。
public class RedFactory implements ProjectFactory{ @Override public Project getname() { // TODO Auto-generated method stub return new redPen(); }}
Project.java(产品类) 。
public interface Project { void name();}
Bluepen.java(ConcreteProject1) 。
public class Bluepen implements Project{ @Override public void name() { // TODO Auto-generated method stub System.out.println("这是一个蓝色的笔"); }}
RedFactory.java(ConcreteProject2) 。
public class RedFactory implements ProjectFactory{ @Override public Project getname() { // TODO Auto-generated method stub return new redPen(); }}
测试类 。
public class Client { public static void main(String[] args) { Project pen = new RedFactory().getname(); pen.name(); Project pen1 = new BlueFactory().getname(); pen1.name(); }}
运行结果:
这个时候发现客户端不在和一个具体的子类耦合在一起了,就算以后增加了新的子类,那么也只需要修改Factory类即可.
使用场景:
消费者不关心它所要创建对象的类(产品类)的时候.
消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候.
例如:hibernate里通过sessionFactory创建session、通过代理方式生成ws客户端时,通过工厂构建报文中格式化数据的对象.
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类.
抽象工厂模式与工厂方法模式的区别 。
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类.
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。. 。
如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式.
Factory.java(抽象工厂) 。
public interface Factory { PhoneProject projectPhone(); LaptopProject projectLaptop();}
HuaWeiFactory.java(华为具体工厂) 。
public class HuaWeiFactory implements Factory{ @Override public PhoneProject projectPhone() { // TODO Auto-generated method stub return new HuaWeiPhone(); } @Override public LaptopProject projectLaptop() { // TODO Auto-generated method stub return new HuaWeiLaptop(); }}
XiaomiFactory.java(小米具体工厂) 。
public class XiaomiFactory implements Factory{ @Override public PhoneProject projectPhone() { // TODO Auto-generated method stub return new XiaomiPhone(); } @Override public LaptopProject projectLaptop() { // TODO Auto-generated method stub return new XiaomiLaptop(); }}
LaptopProject.java(笔记本产品) 。
public interface LaptopProject { void getId(); void printInfo();}
HuaWeiLaptop.java(华为笔记本) 。
public class HuaWeiLaptop implements LaptopProject{ @Override public void getId() { // TODO Auto-generated method stub System.out.println("编号"+123); } @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("生产了华为电脑"); }}
XiaomiLaptop.java(小米笔记本) 。
public class XiaomiLaptop implements LaptopProject{ @Override public void getId() { // TODO Auto-generated method stub System.out.println("编号"+213); } @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("生产小米电脑"); }}
PhoneProject.java(手机产品) 。
public interface PhoneProject { void getId(); void printInfo();}
HuaWeiPhone.java(华为手机) 。
public class HuaWeiPhone implements PhoneProject{ @Override public void getId() { // TODO Auto-generated method stub System.out.println("编号:"+123412); } @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("生产华为手机"); }}
XiaomiPhone.java(小米手机) 。
public class XiaomiPhone implements PhoneProject{ @Override public void getId() { // TODO Auto-generated method stub System.out.println("编号:"+123412); } @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("生产了小米手机!!"); }}
测试类:
public class Client { public static void main(String[] args) { PhoneProject huawei = new HuaWeiFactory().projectPhone(); huawei.printInfo(); huawei.getId(); PhoneProject xiaomi = new XiaomiFactory().projectPhone(); xiaomi.printInfo(); LaptopProject huawei1 = new HuaWeiFactory().projectLaptop(); huawei1.printInfo(); }}
运行结果:
。
抽象工厂模式是工厂方法模式的升级版,后者面向单个产品,而前者面向的的是一个产品族。根据官方定义:为创建一组相关/互相依赖的对象提供一个接口而无需指定它们的具体类。 比如一个汽车工厂要生成骑车,而每种汽车都有车门、车轮胎等一系列产品,这意味着每增加一款汽车就需要增加一个新的工厂来提供新产品的实现。这时候就可以使用抽象工厂模式来进行设计。抽象工厂模式适用于一系列产品族.
优点: 抽象厂模式将产品族的依赖与约束关系放到抽象工厂中,便于管理。职责解耦,用户不需要关心一堆自己不关心的细节,由抽象厂来负责组件的创建切换产品族容易,只需要增加一个具体工厂实现,客户端选择另-个套餐就可以了 缺点: 抽象工厂模式类增加的速度很快,有一个产品族就需要增加一一个具体工厂实现,比较繁琐产品族难以扩展产品。当产品族中增加一个产品时,抽象工厂接口中需要增加一个函数,对应的所有具体工厂实现都需要修改,修改放大严重。抽象厂并未完全屏蔽创建细节,给出的都是组件。对于这种情况可以结合工厂模式或简单工厂模式-起使用。 使用场景:
大家应该已经发现了,其实抽象工厂模式如果只有一个组件的话,其实是退化到工厂方法模式,也就是没有了产品族的概念,只剩一一个产品了,因此简单工厂,厂方法,抽象工厂这三者之间是有内在联系的,区别只产品的复杂度。抽象工厂的本质是选择产品族,因此大家可以根据这个特征来识别是否可以应用抽象厂.
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我的更多内容! 。
原文链接:https://blog.csdn.net/zsr6135/article/details/119444750 。
最后此篇关于一篇文章带你入门java工厂模式的文章就讲到这里了,如果你想了解更多关于一篇文章带你入门java工厂模式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Hive —— 入门 Hive介绍 Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一
HBase —— 入门 HBase介绍 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”
零:前端目前形势 前端的发展史 HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面 -> 给后端(PHP、Python、Go、Java) ->
在本教程中,您将了解在计算机上运行 JavaScript 的不同方法。 JavaScript 是一种流行的编程语言,具有广泛的应用程序。 JavaScript 以前主要用于使网页具有交
我曾经是一个对编程一窍不通的小白,但因为对互联网世界的好奇心和求知欲的驱使,我踏入了编程的殿堂。在学习的过程中,我发现了一门神奇的编程语言——Python。Python有着简洁、易读的语法,让初学者能
嗨,亲爱的读者们! 今天我要给大家分享一些关于Python爬虫的小案例。你是否曾为了获取特定网页上的数据而烦恼过?或者是否好奇如何从网页中提取信息以供自己使用?那么,这篇文章将会给你一些启示和灵感。
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想创建一个像https://apprtc.appspot.com/?r=04188292这样的应用程序。我对 webrtc 了解一点,但无法掌握 google app-engine。如何为 java
我刚刚开始使用 Python 并编写了一个简单的周边程序。但是,每当我在终端中键入 python perimeter.py 时,都会收到以下错误,我不知道如何解决。 >>> python perime
Redis有5个基本数据结构,string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了
创建发布web项目 具体步骤: 1.在开发工具中创建一个dynamic web project helloword 2.在webContent中创建index.html文件 3.发布web应用到
如果你在 Ubuntu 上使用终端的时间很长,你可能会希望调整终端的字体和大小以获取一种良好的体验。 更改字体是一种最简单但最直观的 Linux 的终端自定义 的方法。让我
1. 前言 ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。现在 SFS3 系统 (校园自由软件交流网学务系统) 计划的
我对 neo4j 完全陌生,我很抱歉提出这样一个基本问题。我已经安装了neo4j,我正在使用shell“localhost:7474/webadmin/#/console/” 我正在寻找一个很好的例子
我正在阅读 ios 4 的核心音频,目的是构建一个小测试应用程序。 在这一点上,我对所有 api 的研究感到非常困惑。理想情况下,我想知道如何从两个 mp3 中提取一些样本到数组中。 然后在回调循环中
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是无关紧要的,因
我下载了 GNUStep并安装了它,但是我不确定在哪里可以找到 IDE。有谁知道什么程序可以用作 GNUStep IDE/从哪里获取它们?否则,有没有人知道有关如何创建和编译基本 GNUStep 程序
我正在尝试开始使用 Apache Solr,但有些事情我不清楚。通读tutorial ,我已经设置了一个正在运行的 Solr 实例。我感到困惑的是 Solr 的所有配置(架构等)都是 XML 格式的。
请问有没有关于如何开始使用 BruTile 的文档? 我目前正在使用 SharpMap,我需要预缓存切片以加快进程 最佳答案 我今天正在研究这个:)Mapsui项目site严重依赖 SharpMap
尽我所能,我无法让 CEDET 做任何事情。 Emacs 24.3。我下载了最新的 CEDET 快照。我从他的底部(不是这样)Gentle Introduction 中获取了 Alex Ott 的设置
我是一名优秀的程序员,十分优秀!