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

海东市网站建设_网站建设公司_UI设计_seo优化

免费cms建站五指,开发公司给物业公司的通知函,wordpress typecho 大数据,做一个页面网站需要多少钱LZ想把简单工厂模式、工厂方法模式和抽象工厂模式整理到一篇博文当中#xff0c;由浅入深#xff0c;应该能方便理解和记忆#xff0c;话不多说#xff0c;进入正题。 一、简单工厂模式 定义#xff1a;从设计模式的类型上来说#xff0c;简单工厂模式是属于创建型模式由浅入深应该能方便理解和记忆话不多说进入正题。 一、简单工厂模式   定义从设计模式的类型上来说简单工厂模式是属于创建型模式又叫做静态工厂方法Static Factory Method模式但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式可以理解为是不同工厂模式的一个特殊实现。   总结成一句话就是由一个工厂对象决定创建出哪一种产品类的实例。下面是百度百科中简单工厂模式的类图。   可以看出上面总共有三种类一个是工厂类Creator一个是产品接口IProduct一个是具体的产品类例如产品A和产品B这之中工厂类负责整个创建产品的逻辑判断所以为了使工厂类能够知道我们需要哪一种产品我们需要在创建产品时传递一个参数给工厂类去表明我们想要创建哪种产品。下面我们将类图翻译成java代码。   首先是产品接口。 public interface IProduct {public void method(); }   接下来是具体的产品类。 public class ProductA implements IProduct{public void method() {System.out.println(产品A方法);}} public class ProductB implements IProduct{public void method() {System.out.println(产品B方法);}}   最后是工厂类。 public class Creator {private Creator(){}public static IProduct createProduct(String productName){if (productName null) {return null;}if (productName.equals(A)) {return new ProductA();}else if (productName.equals(B)) {return new ProductB();}else {return null;}} }   我们测试一下。 public class Client {public static void main(String[] args) {IProduct product1 Creator.createProduct(A);product1.method();IProduct product2 Creator.createProduct(B);product2.method();} }    测试结果。   以上就是简单工厂模式的样子这个模式有个缺点如果新加一种产品类则Creator类的代码要相应改动而工厂方法模式就很好的遵守了开闭原则即对修改关闭对扩展开放。   二、工厂方法模式   定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建这样核心类成为一个抽象工厂角色仅负责具体工厂子类必须实现的接口这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。   可以看到工厂方法模式中定义了一个工厂接口而具体的创建工作推迟到具体的工厂类它是对简单工厂模式中的工厂类进一步抽象化从而产生一个工厂类的抽象和实现体系从而弥补简单工厂模式对修改开放的诟病。   下面是百度百科中给出的该模式的类图。   可以看到上面右半部分是产品抽象和实现体系左半部分是工厂抽象和实现体系其中工厂体系依赖于产品体系每一个工厂负责创造一种产品这就省去了简单工厂中的elseif判断又客户端决定实例化一个特定的工厂去创建相应的产品。   下面我们将类图翻译成代码首先是抽象产品接口。 public interface Light {public void turnOn();public void turnOff();}    下面是具体的产品。 public class BuldLight implements Light{public void turnOn() {System.out.println(BuldLight On); }public void turnOff() {System.out.println(BuldLight Off); }} public class TubeLight implements Light{public void turnOn() {System.out.println(TubeLight On); }public void turnOff() {System.out.println(TubeLight Off); }}   下面是抽象的工厂接口。 public interface Creator {public Light createLight(); }   下面是具体的工厂类。 public class BuldCreator implements Creator{public Light createLight() {return new BuldLight();}} public class TubeCreator implements Creator{public Light createLight() {return new TubeLight();}}    测试一下。 public class Client {public static void main(String[] args) {Creator creator new BuldCreator();Light light creator.createLight();light.turnOn();light.turnOff();creator new TubeCreator();light creator.createLight();light.turnOn();light.turnOff();} }    测试结果。   可以看到如果新增产品只需要添加一个产品类一个该产品的工厂类即可不需要修改任何代码。LZ在看这个模式的时候看到别人给出的例子是JDBC API的设计觉得非常贴切。LZ也把这个例子记录在这里。   众所周知为了统一各个数据库操作的标准于是有了JDBC的API它提供了一系列统一的标准化的操作数据库的接口我们平时操作数据库依赖的就是这些抽象而不是具体的数据库的实现那sun公司是怎么做到的呢用的就是工厂设计模式。   JDBC是如何统一了数据库世界的呢其实最主要的就是靠两个接口。第一个接口是Driver我们大体看下源码。 package java.sql;import java.sql.DriverPropertyInfo; import java.sql.SQLException;/*** The interface that every driver class must implement.*/ public interface Driver {Connection connect(String url, java.util.Properties info)throws SQLException; }   connect方法即创造一个数据库连接也就是说Driver对象就是工厂模式中的Creator接口即工厂类的抽象。   这个类除了connect方法以外还有很多其他方法篇幅原因就不一一展开了我们只关心核心方法接口上有一句注释翻译过来是这是一个任何驱动类都必须实现的接口。也就是说sun公司明确规定所有数据库厂商都必须实现这个接口来提供JDBC服务即java数据库连接服务。    第二个接口是connect方法的返回抽象Connection对象我们看一下源码仍然只关心核心方法就可以。 package java.sql;import java.sql.PreparedStatement; import java.sql.SQLException;/*** PA connection (session) with a specific* database. SQL statements are executed and results are returned* within the context of a connection.* P*/ public interface Connection extends Wrapper {Statement createStatement() throws SQLException;PreparedStatement prepareStatement(String sql) throws SQLException;}   以上两个接口作为JDBC API的一部分它们相当于告诉了数据库生产厂商两个要求。        第一数据库厂商要提供一个数据库驱动类它的作用可以是可以创造数据库连接而这个数据库连接向上转型为我们JDBC的Connection。        第二数据库厂商要提供一个数据库连接的实现类这个实现类可以执行具体数据库的各个操作比如帮我们执行SQL返回执行结果关闭连接等等。   LZ把类图画了一下UML类图对设计模式这块非常重要我个人的经验是永远不要记代码要记设计思想记UML类图记应用场景所谓用抽象构建框架用细节扩展实现。   多标准的工厂方法设计模式啊sun公司正是用这个模式统一了数据库世界。工厂方法模式就是提供一个抽象的工厂一个抽象的产品在上述当中相当于Driver数据库连接工厂和Connection抽象产品实现的一方需要提供一个具体的工厂类比如mysql驱动和一个具体的产品比如mysql数据库连接。   客户端调用时不依赖于具体工厂和产品即到底是mysql驱动mysql数据库连接还是oracle驱动oracle连接我们程序猿不需要管的我们只管使用抽象的driver和connection对吧而是依赖于抽象工厂和抽象产品完成工作。   类图里还有个DriverManangerDriverMananger在这个设计当中扮演者一个管理者的角色它帮我们管理数据库驱动让我们不需要直接接触驱动接口我们获取连接只需要和DriverManager打交道就可以也就是说客户端依赖于DriverManager和Connection就可以完成工作不再需要与Driver关联所以上述说我们依赖于Driver和Connection现在DriverManager帮我们管理Driver那我们只需要依赖于DriverManager和Connection就可以了。回想我们刚开始学习JDBC的时候是不是只要让数据库厂商提供的具体数据库连接类加载就可以直接从DriverManager里取连接了所以这是sun公司为了方便编码给我们提供的一个管理类。    三、抽象工厂模式   抽象工厂模式算是工厂相关模式的终极形基于上面的理解我们不难理解抽象工厂模式它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法而不再是一个而相应的抽象产品也不再是一个了而是一系列相关的产品。这其实是工厂方法模式的一种扩展不是吗?   定义为创建一组相关或相互依赖的对象提供一个接口而且无需指定他们的具体类。   我们看下百度百科给出的类图。     我们把类图翻译成代码看一下。首先是产品族也就是类图右边部分。 package net;interface ProductA {void methodA(); }interface ProductB {void methodB(); }class ProductA1 implements ProductA{public void methodA() {System.out.println(产品A系列中1型号产品的方法);}}class ProductA2 implements ProductA{public void methodA() {System.out.println(产品A系列中2型号产品的方法);}}class ProductB1 implements ProductB{public void methodB() {System.out.println(产品B系列中1型号产品的方法);}}class ProductB2 implements ProductB{public void methodB() {System.out.println(产品B系列中2型号产品的方法);}}    左半部分。 package net;public interface Creator {ProductA createProductA();ProductB createProductB();} package net;public class ConcreteCreator1 implements Creator{public ProductA createProductA() {return new ProductA1();}public ProductB createProductB() {return new ProductB1();}} package net;public class ConcreteCreator2 implements Creator{public ProductA createProductA() {return new ProductA2();}public ProductB createProductB() {return new ProductB2();}}   测试一下。 package net;public class Client {public static void main(String[] args) throws Exception {Creator creator new ConcreteCreator1();ProductA productA creator.createProductA();ProductB productB creator.createProductB();productA.methodA();productB.methodB();creator new ConcreteCreator2();productA creator.createProductA();productB creator.createProductB();productA.methodA();productB.methodB();} }    综上所述简单工厂→工厂方法→抽象工厂是一步步进化的过程。   1首先从简单工厂进化到工厂方法是因为工厂方法弥补了简单工厂对修改开放的弊端即简单工厂违背了开闭原则。   2从工厂方法进化到抽象工厂是因为抽象工厂弥补了工厂方法只能创造一个的产品的弊端。   工厂设计模式可能对像LZ这样平时只针对业务编码的程序猿来说用到的机会少一点但是我们在看源码的过程中一定会看到这个模式比如前面提到的JDBC现在相信再回头看JDBC的源码就能看懂当年sun公司为什么要这么去设计代码大牛们牛X的地方我们才能真的体会到。转载于:https://www.cnblogs.com/peterxiao/p/10207598.html
http://www.ihoyoo.com/news/20815.html

相关文章:

  • 海口网站建设方案策划哪里有做网站设计
  • 网站备案中查询网页设计实训报告总结心得体会
  • 网站开发自学时间wordpress 插件机制
  • 做系统之前的网站哪里可以注册免费域名
  • 昆明网站制作方案1网站建设的目标是什么意思
  • 鄢陵网站建设电脑建站深圳品牌营销咨询公司
  • 安徽网新科技网站建设介绍做百度还是阿里网站好
  • 内蒙古网站seo优化中国现货交易网官网
  • 深圳做义工的网站网络营销外包
  • 网站建设推荐频道WordPress底部固定导航
  • 江苏省建设工程考试网站网络优化师
  • 用vue做网站贵阳经济技术开发区网站
  • 国外设计网站参考门户网站定制开发
  • 论坛开源网站源码小广告怎么制作
  • 安装vs2015网站开发清远 网站建设
  • 爱看视频的网站网站做淘宝联盟
  • 做国外零售的话是在什么网站开店微信管理系统
  • 网站建设旗舰品牌软件开发一个月多少工资
  • 技术先进的网站建设怎么搭建wordpress
  • wordpress做图片站的可能性档案网站建设视频
  • 三合一网站选什么系统网站建设里怎么写文章
  • 外国网站做问卷调查挣钱全球设计行
  • 如何将网址提交到一些权重比较高的网站app购物商城
  • wordpress投稿送积分seo推广业务员招聘
  • 网站建设的维护范围微琅 网站建设
  • 南宁建站官网湖南建筑网
  • 有没有教做健身餐的网站网站设计做什么
  • 做网站 做手机app要学什么软件国内比较牛的网站建设
  • 建设一个完整网站技术路线可以做夫妻的游戏视频网站
  • phpok企业建站系统创意合肥网站建设