简单工厂模式

设计模式(Java语言)- 简单工厂模式

穿精又带淫゛_ 提交于 2020-01-22 10:26:17
  前言     在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(Java语言)- 简单工厂模式 介绍了简单工厂模式,然后总结了简单工厂模式的缺点:     1、当新增类型时,我们不得不修改原来的工厂,这样就违背了设计模式6大原则中的 开闭原则。     2、简单工厂模式使用了静态方法来创建对象,因此无法被实现或继承,从而导致改工厂类缺少灵活性,不易拓展。     3、所有的类的创建都需要这个工厂类,因此系统已工厂类是强依赖的关系,一旦工厂类出现错误,将对整个系统产生比较大的影响。   工厂方法模式就是解决上简单工厂模式的缺点。工厂方法模式UML类图:   创建工厂方法模式步骤   1、创建抽象产品类,定义接口。   2、创建抽象工厂,定义具体工厂的接口。   3、创建具体的产品类   4、创建具体的工厂类   5、客户端调用工厂类创建对象      应用案例   本模式我们加ing继续使用创建手机作为例子来讲解。我们根据上面的步骤来完成创建手机的流程:   第一步定义抽象工厂方法: /** * @className: IphoneFactory * @description: iphone手机工厂类 * @author: rainple * @create: 2020-01-21 20:52 **/ public class

设计模式-简单工厂模式

你说的曾经没有我的故事 提交于 2020-01-19 21:22:39
返回上一级目录: Java设计模式 简单工厂模式,又叫静态工厂模式,是最简单的一种模式,只有3种角色:抽象产品接口,具体产品,工厂角色。 抽象产品接口 ,就是定义产品的行为 /** * @Author zhouw * @Description 就是一个球 * @Date 2020-01-17 */ public interface IBall { void say(); } 具体产品 ,具体产品的实现,也就是我们最终要得到的对象,当然不止一个 /** * @Author zhouw * @Description 篮球的具体实现 * @Date 2020-01-17 */ public class Basketball implements IBall { @Override public void say() { System.out.println("我是一个篮球,又被扔进筐里"); } } /** * @Author zhouw * @Description 足球的具体实现 * @Date 2020-01-17 */ public class Football implements IBall { @Override public void say() { System.out.println("我是一个足球,被踢来踢去"); } } 工厂角色 ,工厂负责创建所有的产品实例 /

c++设计模式之简单工厂模式

ぃ、小莉子 提交于 2020-01-18 09:40:22
问题描述 之前在公司做了一个windows 8平台的阅读器。首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形、图像和文字等等;不同的内容,就是不同的对象;在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘。这个时候,就需要进行很多new操作,new操作分布在代码的不同地方,管理起来很麻烦,而且也很乱,到后期扩展和维护的时候,有的时候,对象多的让开发人员不知道这个对象是干什么的,这就增加了难度;同时,new操作,都会有对应的异常处理,最后,就会发现,在代码中,new了一个对象,然后,就跟着一段异常处理代码,这时编码变的极其混乱和臃肿。那么怎么办?怎么办?此时,我们需要一个新的类,专门从事对象的建立和释放,之后,对象的各种操作,和这个类没有任何关系。这个专门建立对象的类,向外暴漏创建对象的接口,供外部调用。 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。 UML类图 对于工厂模式,具体上可以分为三类: 简单工厂模式; 工厂方法模式; 抽象工厂模式。 对于上面的三种工厂模式,从上到下逐步抽象,并且更具一般性。而这篇博文主要讲的是简单工厂模式

简单工厂模式

浪子不回头ぞ 提交于 2020-01-18 02:56:43
作用 为类的创建提供统一的接口 public class ShapeFactory { public static Shape getShape(String className) { ClassLoader classLoader = ShapeFactory.class.getClassLoader(); try { Class<Shape> aClass = (Class<Shape>) classLoader.loadClass(className); // 实例 instanceof (类); //自身类.class.isInstance(自身实例或子类实例) 类和实例比对 boolean flag = Shape.class.isAssignableFrom(aClass); //前面时父类,后面时子类 类和类比对 if (flag) { Shape shape = aClass.newInstance(); return shape; } } catch (ClassNotFoundException e) { throw new RuntimeException("类名错了"); } catch (InstantiationException e) { throw new RuntimeException("没有无参构造器"); } catch

Java设计模式之简单工厂模式

こ雲淡風輕ζ 提交于 2020-01-15 21:09:28
简单工厂模式(SimpleFactory)是类的创建模式,又叫做静态工厂方法模式,是最基本的设计模式。由一个工厂对象决定创建出哪一种产品的实例,三个重要的角色,工厂类、目标类抽象接口、目标对象类;工厂类包含静态的工厂方法。 伪代码 package testdaemo.bean; import org.springframework.util.Assert; /** * 简单工厂模式 * 静态工厂方法类 */ public class DepotFactory { private DepotFactory(){ } public static Che createObject(String flag){ Che che = null; switch (flag){ case "bike": che = new Bike(); break; case "car": che = new Car(); break; case "train": che = new Train(); break; case "cart": che = new Cart(); break; default: Assert.isTrue(false,"无法生产出对应的车子。"); } return che; } } 工厂类根据传入的参数决定创建哪一类产品的对象实例。核心是工厂类,这个类含有必要的逻辑判断

【设计模式】工厂方法

最后都变了- 提交于 2020-01-11 18:21:13
工厂方法 工厂方法 ,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法是简单工厂的延申。 在简单工厂中,如果想要添加新的产品,那么首先需要添加的一个具体产品类,在之后需要改变工厂类里的switch语句,添加判断。这样就发现,将写好的类更改了,这样其实 违反了开闭原则 。 为了对其进行修正,采取了工厂方法的模式。将工厂也进行抽象,其下面也有继承的具体工厂类,每个工厂类对应一个具体产品的生产。 当然工厂方法的 缺点 也很明显,每加一个产品,就要加一个对应的工厂,增大的开发量。 所以到底是使用简单工厂还是工厂方法,还是需要视情况而定。 来源: https://www.cnblogs.com/LampsAsarum/p/12180585.html

设计模式@第6章:工厂模式

痴心易碎 提交于 2020-01-10 22:51:13
第6章:工厂模式 一、简单工厂模式 (一)看一个具体的需求 看一个披萨的项目:要便于披萨种类的扩展,要便于维护 披萨的种类很多(比如 GreekPizz、CheesePizz 等) 披萨的制作步骤有: prepare,bake, cut, box 完成披萨店订购功能。 (二)使用传统的方式来完成 思路分析(类图) 2) 看老师代码的演示 public abstract class Pizza{ protect String name; // 因为不同的 Pizza 准备方法不同,因此做成抽象方法 public abstract void perpard(); public void bake(){ // XXXXX } public void cut(){ // XXXXX } public void box(){ // XXXXX } } //------------------------------------------------------- // 然后具体的 Pizza 实体继承 Pizza public void CheessPizza extends Pizza(){ //实现 prepare 方法 } //------------------------------------------------------- public void GreekPizza

设计模式——工厂(简单工厂、工厂方法、抽象工厂)

筅森魡賤 提交于 2020-01-07 08:46:12
开发过程中经常听到工厂这个词,其实根据个人经验,简单工厂用的是比较多的。工厂方法和抽象工厂是GoF23种设计模式中的一种,而我们常使用的简单工厂并不是一种设计模式,可以说是我们自己的一种俗称。 定义 简单工厂: 直接通过一个Factory类创建多个实体类的构造方式。 工厂方法: 一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂:个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。 工厂方法与抽象工厂区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 模板 简单工厂 工厂方法 AbstractProduct : 抽象产品 (在工厂方法模式中只有一个AbstractProduct) ConcreteProductXXX : 具体的产品类 AbstractFactory: 抽象工厂类 ConcreteFactory: 具体工厂类(每个工厂只能创建一个具体产品) 抽象工厂 ProductX : 产品接口(抽象工厂中可以有多个产品抽象类) ConcreteProductX : 具体产品 Creator: 抽象工厂类

【设计模式自习室】理解工厂模式的三种形式

折月煮酒 提交于 2020-01-04 00:19:06
前言 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的 介绍 ,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :模式不是万金油,不可以滥用模式 该模式的 实际使用案例 :了解它在哪些重要的源码中被使用 该系列会逐步更新于我的博客和公众号(博客见文章底部) 也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇:为什么我们要用设计模式? 【设计模式自习室】建造者模式 【设计模式自习室】原型模式 【设计模式自习室】透彻理解单例模式 创建型——简单工厂/工厂模式/抽象工厂 引子 工厂模式是一个非常重要的创建型模式,但是工厂模式又分为好多种,并且网上文章很多,很多对工厂模式的定义都不是很明确,甚至还互相冲突,本文希望通过放在一起串讲的形式,力求能够用最简洁的语言 理清 工厂模式。 先看一个工厂模式的定义: “Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to

设计模式入门-简单工厂模式

旧巷老猫 提交于 2019-12-31 00:04:44
前言 话说设计模式是我们面试中经常遇到的问题,但是开发中遇到的也不少。之前一直想学设计模式,然后总结写一些文章,但一直忙于其它事情,现在终于要学习设计模式,参考的书籍是《大话设计模式》,这本书写得通俗易懂,推荐大家都去看一下。 场景描述 借用书中示例问题,计算两个数的加、减、乘、除等其它运算,一般我们的思维是自上而下处理问题,也就造成了运算两个数就要经过多次判断。 场景示例 两个数之前的算法运算,如下面代码所示: package me.xueyao; /** * @author Simon.Xue * @date 2019-12-30 22:54 **/ public class OperationHello { public static void main(String[] args) { System.out.println(getResult("*", 1, 3)); } public static int getResult(String operationStr, int number1, int number2) { int result = 0; switch (operationStr) { case "+": result = number1 + number2; break; case "-": result = number1 - number2;