工厂模式

java设计模式----工厂模式

吃可爱长大的小学妹 提交于 2020-02-07 17:53:46
简单工厂模式 简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某个产品的类。 比如下图中的鼠标工厂,专业生产鼠标,给参数 0,生产戴尔鼠标,给参数 1,生产惠普鼠标。 工厂模式 工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。 戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。 生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。 后续直接调用 鼠标工厂.生产鼠标()即可 抽象工厂模式 抽象工厂模式也就是不仅生产鼠标,同时生产键盘。 也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。 戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。 创建工厂时,由戴尔工厂创建。 后续 工厂.生产鼠标()则生产戴尔鼠标, 工厂.生产键盘()则生产戴尔键盘。 在抽象工厂模式中,假设我们需要增加一个工厂 假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。 之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。 在抽象工厂模式中,假设我们需要增加一个产品 假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。 之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。 以上。

工厂模式

自作多情 提交于 2020-02-07 17:53:08
工厂模式 意图: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 需要解决的问题: 主要解决接口选择的问题。 何时使用: 我们明确地计划不同条件下创建不同实例时。 如何解决: 让其子类实现工厂接口,返回的也是一个抽象的产品。 关键代码: 创建过程在其子类执行。 简单工厂模式 简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某个产品的类。 比如下图中的鼠标工厂,专业生产鼠标,给参数 0,生产戴尔鼠标,给参数 1,生产惠普鼠标。 工厂模式 工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。 戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。 生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。 后续直接调用 鼠标工厂.生产鼠标()即可 抽象工厂模式 抽象工厂模式也就是不仅生产鼠标,同时生产键盘。 也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。 戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。 创建工厂时,由戴尔工厂创建。 后续 工厂.生产鼠标()则生产戴尔鼠标, 工厂.生产键盘()则生产戴尔键盘。 设计时将Mouce 和 Keybo设计成接口,不同厂家的鼠标和键盘设计成实现。 假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类

工厂模式

南楼画角 提交于 2020-02-06 17:32:39
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决:主要解决接口选择的问题。 何时使用:我们明确地计划不同条件下创建不同实例时。 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。 关键代码:创建过程在其子类执行。 应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。 优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。 使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问

设计模式-工厂模式

元气小坏坏 提交于 2020-02-06 08:57:13
简单工厂模式 属于设计模式类型中的创建型模式,所谓创建型模式是指:在创建对象的同时隐藏创建逻辑的方式,而不是用new运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加的灵活。 工厂模式是我们常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。我们经常用户new来创建对象,例如,B b = new B()。 为什么需要工厂模式?面向对象的封装和分派告诉我们,尽量将长的代码分派“切割”成每一段,将每段再“封装”起来(减少段与段之间的耦合联系性),这样就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。 简单工厂模式将创建实例的工作和使用实例的工作分开,将对象的创建交给专门的工厂负责。缺点在于工厂类不够灵活,增加新的产品需要修改工厂类的判定逻辑。 #include "stdafx.h" #include <iostream> using namespace std; // 产品基类 class Book { public : virtual void read() = 0; // 抽象基类 }; // 书籍1 class Book1 : public Book { public : void read() { cout << "This book is c++.\n" ; } }; // 书籍2 class Book2 :

设计模式2-工厂模式

三世轮回 提交于 2020-02-06 08:33:22
工厂模式 适用场景 创建对象需要大量重复的代码 应用层不依赖于产品类实例如何被创建实现等细节 一个类通过其子类来指定创建哪个对象 优点 用户只需要关系所需产品对应的工厂,无需关系创建细节 加入新产品符合开闭原则,可提高拓展性 缺点 类的个数容易过多,增加复杂度 增加了系统的抽象性和理解难度 代码 创建一个基础类 public abstract class AbstractVideo { /** * 一个行为方法 */ public abstract void produce(); } 创建两个具体类 继承基础类 public class JavaVideo extends AbstractVideo { @Override public void produce() { System.out.println("录制Java视频"); } } public class PythonVideo extends AbstractVideo { @Override public void produce() { System.out.println("录制Python视频"); } } 创建一个工厂类基础类 public abstract class VideoFactory { public abstract AbstractVideo getVideo(); } 创建两个具体工厂类

程序间的解耦合——工厂模式

雨燕双飞 提交于 2020-02-06 02:04:16
此处对工厂模式的分析目的是为了更好地理解Spring IOC 一、程序的耦合 耦合,这里可以简单的理解为:程序间的依赖。 常见的耦合包括:类之间的耦合、方法间的耦合。 解耦:降低程序间的依赖关系。 在实际开发中应该做到: 编译期间不依赖,运行期间才依赖。 public class AccountServiceImpl implements IAccountService { private IAccountDao accountDao = new AccountDaoImpl(); } 上面的代码表示: 业务层调用持久层,并且此时业务层在依赖持久层的接口和实现类。如果此时没有持久层实现类,编译将不能通过。这种编译期依赖关系,应该在我们开发中杜绝。我们需要优化代码解决。 解耦思路: 第一步:使用反射来创建对象,避免使用new关键字。 第二步:通过读取配置文件来获取要创建的对象的全限定类名 二、工厂模式解耦 在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来 并存起来 。在接下来的使用的时候,直接拿过来用就好了。 那么,这个读取配置文件,创建和获取三层对象的类就是工厂。 这里使用的是Properties配置文件,存放的是获取对象时的唯一标志和全限定类名(也就是基于xml配置方式实现ioc时

Java 设计模式之工厂模式

人盡茶涼 提交于 2020-02-05 21:53:57
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。我们只关注创建工厂对象。通过给工厂对象传递不同参数来实现获得不同的子类。 介绍 意图 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决 主要解决接口选择的问题。我们通过工厂来替我们选择,对于不知情的人,只要传入参数,工厂会自动为我们选择一个类。 何时使用 我们明确地计划不同条件下创建不同实例时。 如何解决 让其子类实现工厂接口,返回的也是一个抽象的产品。也就是说实际返回的是接口类。 应用实例 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。 优点 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。 缺点 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖

Factory Method

北战南征 提交于 2020-02-05 10:19:38
工厂模式是我们最常用的实例化对象模式之一。 特点是,使用工厂方法代替new操作的一种模式。 使用工厂模式,可以给系统更大的可扩展性和尽量少的修改量 因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式 123456789101112131415161718192021222324252627282930313233343536 * 工厂模式<br>* @author YangYu* @version 1.0*/public class { public static void main(String[] ar 大专栏 Factory Methodgs) { Sample a = new Sameple(1); //通过 Sample b = new creator(1); }}class Sample { int arg; * @param x * @return Sample */ public Sample(int x) { arg = x; }}class Factory { public static Sample creator(int which) { if (which == 1) return new Sample(1);

深入PHP(第三版)——工厂模式

蹲街弑〆低调 提交于 2020-02-02 02:34:04
模式介绍 工厂模式:定义一个创建对象的接口,但是让子类去实例化具体类。工厂方法模式让类的实例化延迟到子类中。针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例,在同一等级结构中,支持增加任意产品。 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 什么时候使用工厂方法模式 如果实例化对象的子类可能改变,就要使用工厂方法模式。 工厂方法角色 工厂方法模式包含如下角色: 抽象产品(Product)角色:具体产品对象共有的父类或接口 具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例 抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。 实例 //创建抽象工厂角色 interface Creator { public function factoryMethod(); # 定义一个工厂方法 }

设计模式-工厂模式

二次信任 提交于 2020-01-31 03:52:42
工厂模式是创建型设计模式之一,是我们平时开发最常用到的设计模式。工厂模式的作用是什么呢?工厂顾名思义作用就是生产,在编程中自然就是生产对象。工厂模式就是一个用于生产对象的模式,也是对于程序可扩展性的最直接最典型的体现。 举例:我要写一个生产产品的程序。 创建一个抽象的程序类 package com.example.factory; public abstract class Product { public String price; public String name; public abstract void createProduct(); } 创建两个子类,ProductA ProductB package com.example.factory; public class ProductA extends Product { @Override public void createProduct() { System.out.println("Create ProductA"); } } package com.example.factory; public class ProductB extends Product { @Override public void createProduct() { System.out.println("Create