工厂模式

php设计模式--工厂模式

◇◆丶佛笑我妖孽 提交于 2020-03-23 09:33:57
这几天了解到了得好好学习下PHP的设计模式,所以找了些资料来标记,每天进步一小步哈! 1.工厂模式   工厂模式最大的优点在于创建对象,有点适配器的感觉,大体上是根据不同的参数,工厂去实现不同的对象,返回给调用者,工厂把实例对象的过程封装起来。 减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码。   通俗的说,以前创建一个对象要使用new,现在把这个过程封装起来了。 假设不使用工厂模式:那么很多地方调用类a,代码就会这样子创建一个实例:new a(),假设某天需要把a类的名称修改,意味着很多调用的代码都要修改。 工厂模式的优点就在创建对象上。建立一个工厂(一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来, 创建对象不是使用new的形式了。而是定义一个方法,用于创建对象实例。   其实工厂模式的设计思想最主要的是根据不同的参数去实例不同的对象,返回给调用者,这是工厂模式设计思想的精髓。   工厂模式我想到的一个典型的应用就是:php可能要链接mysql,也可能要链接sqlserver,还有其他什么数据库。那么做一个抽象的数据库类,   这个类就是一个工厂类,专门负责产生不同的对象。    class DbFactory { function static factory($db_class_name) { $db_class_name =

创建型模式之工厂模式

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-20 23:15:35
3 月,跳不动了?>>> 1 概述 创建型模式 ,提供了一种创建对象的最佳实践。 工厂方法模式 的核心思想,是通过统一的工厂类来获取对象,而不需要调用类的构造方法。 2 优点 可以将类的实例化过程延缓到子类。调用者无需知道接口/抽象类的具体实现是什么,利用工厂方法即可获取类的实例,降低与调用者的耦合度。 隐藏类的构造细节,降低类创建的复杂度,提高程序可读性。 可以根据不同环境/参数,从工厂构造不同的方法。 3 案例 有一个饭店的接口,饭店里有厨师和服务员。我们定义 KFC 和 PizzaHut 两个饭店: interface Restaurant { void getCook(); void getWaiter(); } public class KFC implements Restaurant { [@Override](https://my.oschina.net/u/1162528) public void getCook() { System.out.println("I'm KFC cook."); } [@Override](https://my.oschina.net/u/1162528) public void getWaiter() { System.out.println("I'm KFC waiter."); } } class PizzaHut

工厂模式

倖福魔咒の 提交于 2020-03-19 14:57:44
3 月,跳不动了?>>> 简单工厂 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。不属于GOF 23种设计模式。 优点:解耦,简单工厂适用于工厂类负责创建对象较少的场景;客户只需要传入工厂类的参数,对于如何创建类的逻辑不需要关系。 缺点:工厂类的职责过重,不易于扩展过于复杂的产品结构。 例子: public interface ISimple { void output(); } public class SimpleA implements ISimple{ @Override public void output() { System.out.println("输出:SimpleA"); } } public class SimpleB implements ISimple{ @Override public void output() { System.out.println("输出:SimpleB"); } } public class SimpleFactory { public ISimple outputObject(Class<? extends ISimple> clazz

工厂模式

醉酒当歌 提交于 2020-03-18 00:22:48
工厂模式,有工厂就有产品,工厂里就是加工产品的,这个模式有以下参与者: 1.抽象产品,对象产品的对像接口或抽象层。 2.具体产口,实现抽象产品的接口。 3.抽象工厂,工厂的方法,方法用于反回产品对象。可以用抽象类或接口定义 4.具体工厂,实现抽象工厂接口的具体类 unit Unit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TProcedure = class(TObject)//产品抽象类 public procedure ShowCarName; virtual; abstract; end; TProcedureNissan = class(TProcedure) //产品具体类 public procedure ShowCarName; override; end; TProcedureToyota = class(TProcedure) //产品具体类 public procedure ShowCarName; override; end; TFactoryInterface

设计模式之工厂模式

拈花ヽ惹草 提交于 2020-03-17 07:06:42
Saying and doing are two different things. 简单工厂模型 何谓工厂?可以生产产品,产品可以枚举。 #include<iostream> class AbstructProduct { public: virtual~AbstructProduct() {}; virtual void show() = 0; }; class ConcreteProductA : public AbstructProduct { public: void show() override { std::cout<< "show product A." <<std::endl; } }; class ConcreteProductB : public AbstructProduct { public: void show() override { std::cout<< "show product B." <<std::endl; } }; class SimpleFactory { public: ConcreteProductA createProductA() { return ConcreteProductA{}; } ConcreteProductB createProductB() { return ConcreteProductB{}; } };

工厂模式

混江龙づ霸主 提交于 2020-03-17 02:27:18
工厂模式 该模式通过向工厂传递类型来指定要创建的对象。 XiaoMiPhone ,小米手机 public interface XiaoMiPhone { void buy ( ) ; } XiaoMi7 class XiaoMi7 implements XiaoMiPhone { public void buy ( ) { System . out . println ( "购买了XiaoMi7" ) ; } } XiaoMi8 class XiaoMi8 implements XiaoMiPhone { public void buy ( ) { System . out . println ( "购买了XiaoMi8" ) ; } } XiaoMi9 class XiaoMi9 implements XiaoMiPhone { public void buy ( ) { System . out . println ( "购买了XiaoMi9" ) ; } } XiaoMiFactory ,小米旗舰店,告知你要买的手机型号就可以得到对应的对象。 public class XiaoMiFactory { public static XiaoMiPhone getXiaoMiPhone ( String type ) { if ( "小米7" . equals ( type ) )

02-工厂模式

此生再无相见时 提交于 2020-03-17 01:22:46
工厂模式 1、简单工厂模式 简单工厂模式适用于工厂类负责创建的对象较少的情况,客户端只需要传入工厂类的参数,具体的创建细节客户端不需要关心,由工厂类具体实现。 由一个工厂对象决定创建出哪一种产品类的实例,属于创建型模式。 减少代码的冗余程度 看代码 定义顶层工厂接口,提供一个所有产品都要实现的方法 public interface ICourse { void record ( ) ; } 定义两种课程,java或者python public class JavaCourse implements ICourse { public void record ( ) { System . out . println ( "录制Java课程" ) ; } } public class PythonCourse implements ICourse { public void record ( ) { System . out . println ( "录制Python课程" ) ; } } 创建一个工厂类根据参数创建对应的对象 public class CourseFactory { public ICourse create ( Class < ? extends ICourse > clazz ) { try { if ( null != clazz ) { return clazz

java实现简单工厂模式

一曲冷凌霜 提交于 2020-03-16 21:19:20
昨天看了一下设计模式,复习了一下简单工厂模式,做个笔记,浅淡一下我对简单工厂模式的理解。书上使用的是C#,因为我所学的是Java,所以本人就用Java实现了一遍。如果有讲的不对的地方,希望能够指出来。简单工厂设计模式可以简单地理解为,你拿着一个空口袋去水果店买水果,你把空袋子给水果店老板,然后对老板讲我需要一袋子的柚子,十分钟以后。老板递给你一袋子柚子。你不需要知道他们是怎么区分柚子和橘子,又是怎么把柚子装进袋子的。你只需要知道你去了水果店,告诉他你需要一袋柚子。   代码可以简单理解为,水果店,水果和柚子三部分。如果不谈用户交互界面的话,能和你直接接触的是水果店,下面这段代码可以理解为水果店,用来创造水果的。你可以告诉他你需要什么样的水果,他会返回你一袋水果。 下面是水果的代码,定义了水果的共性和方法: package cn.cyy; public abstract class Fruit { protected double weight; public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public abstract void getResult(); } 下面是水果店的代码,水果店就可以看做是工厂

设计模式学习记录

你说的曾经没有我的故事 提交于 2020-03-16 12:00:18
最近一段时间学习了设计模式,在此记录一下自己对于设计模式的理解。 一 设计模式的原则 1、单一职责原则 一个类或者方法只做一件事情,或者说只有一个角色。例如一个短信工具类,只负责和短信有关的。 (扩展一下,一个类或方法,在写代码的时候每个模块做的事应该是一个水平的,就是说一件事 1,2,3三个步骤,每个步骤有诺干小步骤,小步骤应该放到子方法或子类中,当前模块就负责1,2,3步骤的整合。ps: 代码整洁之道里面的,这里记录一下) 2、接口隔离原则 一个类继承一个接口,接口的方法都应该是子类中能用的着的 ,不然的话用不着的部分可以 拆分成另外的接口 3、依赖倒转原则 new一个类的时候尽量用这个类的父级去接收,一个系统中,一个类的成员不要是同级别类的子类。 4、里氏替换原则 规范是子类不能改变覆盖父类的非抽象方法,重载父类方法时,入参可以更宽松(一开始没明白过来,后来反应过来,就是参数使用父类叫重载,是另外一个方法,相当于子类有两个方法,参数小于等于子类,那就是覆盖父类方法了,违反历史转换原则了)。目的就是在所有父类能用的地方替换成任何子类都能用 5、开闭原则 扩展了功能,对原有的功能不影响 6、迪米特法则 只与直接的朋友发生通信,直接的朋友指的是成员变量,方法参数,返回类型中的是成员参数,如果方法中出现有类型不是该类所有成员变量,方法参数,返回类型中的任何一个,都违反了迪米特法则

设计模式之工厂模式(2)工厂方法模式

久未见 提交于 2020-03-11 17:43:54
学习设计模式的日常Demo 工厂方法模式 工厂方法模式介绍 代码实现: abstract class OrderPizza { // 定义一个抽象方法,让各个工厂自己实现 abstract Pizza createPizza ( String orderType ) ; public void buy ( ) { String orderType = "" ; // 用户输入的 Pizza pizza = null ; do { orderType = getType ( ) ; pizza = createPizza ( orderType ) ; // 抽象方法,由工厂子类实现 //输出pizza if ( pizza != null ) { // 订购成功 pizza . prepare ( ) ; pizza . bake ( ) ; pizza . cut ( ) ; pizza . box ( ) ; } else { System . out . println ( "订购披萨失败" ) ; break ; } } while ( true ) ; } // 写一个方法,可以获取客户输入的披萨种类 private String getType ( ) { try { BufferedReader strin = new BufferedReader ( new