工厂模式

设计模式-工厂模式

回眸只為那壹抹淺笑 提交于 2020-02-23 16:00:09
工厂模式  当我们创建一个对象比较复杂时且客户端不关心于实例对象的创建过程时我们可以用工厂模式 类型: 简单工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 百度百科 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现 下面我们来举一个例子: 比如我们一个手机可能有苹果、华为、小米这些品牌的手机,手机里面又有很多零件,如果当一个手机的类定义是这样的 public class Mobile implements IMobile{ ​ //CPU private String cpu; //内存 private String memory; //显示屏 private String display; ​ ​ public Mobile(String cpu, String memory, String display) { this.cpu = cpu; this.memory = memory; this.display = display; } public void show() { System.out.println(this.getDisplay()

23种设计模式——工厂模式

陌路散爱 提交于 2020-02-23 03:31:17
文章目录 工厂模式 1. 简单工厂模式 2.厂方法模式 简单工厂和方法工厂对比 工厂模式 工厂模式: (Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 核心本质 : 实例化对象不用 new,用工厂方法代替。 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。 三种模式: 简单工厂模式 用来生产同一等级结构的任意产品。 (对于增加新的产品,需要覆盖已有代码) 工厂方法模式 用来生产同一等级结构中的固定产品。(支持增加任意产品) 抽象工厂模式 围绕一个超级工厂创建其他工厂。超级工厂又称为其他工厂的工厂。 1. 简单工厂模式 创建一个接口, public interface Car { public void name ( ) ; } 编写类实现接口, WuLing.class public class WuLing implements Car { @Override public void name ( ) { System . out . println ( "五菱宏光" ) ; } } Tesla .class public class Tesla implements

创建者模式 -- 工厂模式

こ雲淡風輕ζ 提交于 2020-02-17 22:34:11
使得创建者与调用者分离 三种实现方式: 简单工厂模式:   是根据不同的参数返回不同的实例,只有一个工厂。如果增加新的产品,会修改原来的代码,所以不完全满足OCP原则。 工厂方法模式:   不同的产品有不同的工厂(有一个总的工厂的接口) 抽象工厂模式: (拥有多个产品类型,有多个产品接口)   用来生产不同 产品族 的全部产品。 简单工厂模式和工厂方法模式是针对于单个产品 抽象工厂模式是针对于产品族 简单工厂模式和工厂方法模式的对比: 结构复杂度 : 简单工厂模式只有一个工厂,工厂方法模式工厂数据随着产品增加而增加 代码复杂度&管理上的难度: 工厂方法模式类多 客户端编程复杂度 :工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP,但是在客户端编码中需要对工厂类进行实例化,而简单工厂模式的工厂类是一个静态类,在客户端无需实例化,这无疑是个吸引人的优点 简单工厂模式不完全满足OCP原则,工厂方法模式满足OCP原则,但是在一般情况下,使用简单工厂模式较多。 来源: https://www.cnblogs.com/DDiamondd/p/10969026.html

再战设计模式(二)之工厂模式

拜拜、爱过 提交于 2020-02-17 18:28:14
面对对象设计的原则 1.OCP (开闭原则 open-close principle) 一个软件类的实体 应该对扩展开放对修改关闭 2.DIP(依赖反转原则 Dependence Inversion principle) :要针对接口编程 不要针对实现编程 通俗来讲 就是依赖于接口而不是类调用之间之间调用. 3.LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信. 就是这个本身这个类.尽量少于别的类有关系 工厂模式 1.实现了调用者和创建者的分离 2.它的详细分类 简单工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 如果只是继承的话.调用者调用父类.也要调用子类 接口 /** * @Created by xiaodao */ public interface Car { void run(); } 实现类: public class Byd implements Car { @Override public void run() { System.out.println("比亚迪....."); } } 实现类: public class Audi implements Car{ @Override public void run() { System.out.println("奥迪...在跑..."); } } 调用者: /** *

简单的工厂模式

谁说胖子不能爱 提交于 2020-02-17 11:52:49
从今天开始 每天进步一点点。开始了解并学习设计模式,就从简单的工厂模式开始吧.... 简单工厂模式 (Simple Factory):不利于产生系列产品 简单工厂模式又称 静态工厂方法模式 。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。 先来看看它的组成: 1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 一句话概括就是    简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。 接下来 就用简单的工厂模式设计一个计算器: 首先 我们先创建一个实体类: 接着就开始创建加减乘除的实体类来继承这个基础的具体父类 然后就开始创建工厂类 最终的运行结果: 这个计算器只需要输入运算符号,工厂就实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果。 来源: https://www.cnblogs.com

设计模式--工厂模式

蹲街弑〆低调 提交于 2020-02-15 15:50:58
工厂模式 定义:分为简单工厂模式,工厂方法模式和抽象工厂模式,它们都属于设计模式中的创建型模式其主要功能都是帮助我们把对象的实例化部分抽取出来,     目的是降低系统中代码耦合度,并且增强了系统的扩展性。 A. 简单工厂模式 :   优点:在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责   缺点:工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码逻辑将会非常复杂。   图解: package com.offcn.designpattern.factorypattern;public class SimpleFactoryPattern { public static void main(String[] args) { Phone phone = SimpleFactory.create("oppo"); phone.getPhoneName(); Phone phone1 = SimpleFactory.create("vivo"); phone1.getPhoneName(); }}interface Phone{ void getPhoneName();}class Oppo implements Phone{ @Override public void getPhoneName() { System.out

设计模式总体概述

社会主义新天地 提交于 2020-02-15 10:55:41
创建型模式 单例模式 定义:确保一个类只有一个实例,提供全局访问点。 目的: 使得在操纵该对象时始终只是该实例,防止资源的浪费 个人理解: 就是一个对象只能被创建一次,在定义的范围内只存在唯一的一个。从被创建到被销毁,不存在和他一样的对象。 uml图: 实现形式: public class Singleton { //volatile保证,当uniqueInstance变量被初始化成Singleton实例时,多个线程可以正确处理uniqueInstance变量 private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getInstance() { //检查实例,如果不存在,就进入同步代码块 if (uniqueInstance == null) { //只有第一次才彻底执行这里的代码 synchronized(Singleton.class) { //进入同步代码块后,再检查一次,如果仍是null,才创建实例 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } } 原型模式 定义:用一个已经创建的实例作为原型

工厂模式(Factory Pattern)

旧街凉风 提交于 2020-02-14 17:27:02
工厂模式(Factory Pattern) 在该模式中,创建对象时不会暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 目的: 定义一个创建对象的接口,令其子类自己决定实例化哪一个类,使其创建过程延迟到子类进行。 主要解决: 接口选择的问题。 何时使用: 明确计划不同条件下创建不同的实例。 如何解决: 让其子类实现工厂接口,返回的是一个抽象的产品。 关键代码: 创建过程在子类进行。 使用场景: 1.日志记录器:用户可以选择日志记录到什么位置。 2.数据库访问:当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化的时候。 3.设计一个连接服务器的框架,可以将多个协议(POP3, IMAP, HTTP)作为产品类,共同抽象出一个接口。 注意事项: 复杂对象可以使用工厂模式,简单的就直接new。因为工厂模式需要引入工厂,增加系统的开销和复杂度。 优点: 1.可以根据产品类的名称创建对象; 2.高扩展性,需要一个新的产品类的时候,直接添加一个子类就可以; 3.屏蔽产品的具体实现,只用关心产品的接口(抽象产品类)就可以。 缺点: (由优点第2点可以得出)当系统的产品类和工厂类(用于构建产品类)过多的时候,增加了系统的复杂度。 一个工厂模式的简单代码 1 /** 2 * @author: wooch 3 * @create: 2020/02/13 4 */ 5 public

设计模式之工厂模式

╄→гoц情女王★ 提交于 2020-02-12 12:13:05
(最近在家中自学设计模式,参考网上的视频,做简单的理解记忆)工厂模式的设计也是为了减少对象之间的耦合关系。 不适用设计模式的订购与产品UML类图 如果不使用工厂模式,Pizza父类下有其子类不同的设计与实现,对于客户端OrderPizza对象就需要依赖Pizza以及依赖其子类,这样对象之间的耦合程度加大,如果有多个OrderPizza客户端时,每个客户端对象都需要依赖其他类。 简单工厂模式:是由一个工厂对象决定创建出哪一个产品类的实例对象 使用简单工厂的UML类图: 使用简单工厂设计模式,由工厂进行创建需要的产品类的实例对象。 工厂方法模式,对于同一个产品可能有多个工厂进行设计实现,其实现的方式或许有所不同,客户端访问时可以选择不同的工厂来进行创建不同的产品实例对象,但是不同的工厂会遵循相同的某种规则进行指定。 工厂方法模式的UML类图: 抽象工厂模式:定义一个接口interface用于创建相关或有依赖的对象族,不指定具体的类 抽象工厂相当于将简单工厂与工厂方法模式整合的结果。 工厂模式的使用场景:jdk中的Calendar类使用的是工厂模式 简单的源码如下: //Calendar 类中的实例创建方法 public static Calendar getInstance ( ) { return createCalendar ( TimeZone . getDefault ( )

工厂模式{C#描述}

China☆狼群 提交于 2020-02-08 05:01:30
概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。 简而言之: 通过传入"类名", 创建不同的对象. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 类: CAdmin(管理员类), CUser(普通用户类) 接口: IUser(用户类) 关系: CAdmin(管理员类), CUser(用户类) 都实现 IUser接口 类: CAdmin(管理员类) namespace WebApplication1 { public class CAdmin:IUser { #region IUser 成员 public string GetName() { return "我是管理员, 小样敢乱发言逮捕!"; } #endregion } } 类: CUser(普通用户类) namespace WebApplication1 { public class CUser:IUser { #region IUser 成员 public string GetName() { return "我是普通用户!"; } #endregion } }