工厂模式

厘清面向对象四种模式:工厂模式、构造函数模式、原型模式、混合模式

对着背影说爱祢 提交于 2019-11-28 06:29:40
/*--> */ /*--> */ 面向对象是一种方法,用来封装功能,方便日后使用,避免大量的重复工作 一、工厂模式 (一)实现方法:在函数内创建一个对象并给对象赋予属性及方法,最终将对象返回。 1 function cPerson(name,sex,age){ 2 3 var o = new Object(); 4 5 o.name = name; 6 7 o.sex = sex; 8 9 o.age = age; 10 11 o.show = function(){ 12 13 console.log(this.name,this.age,this.sex); 14 15 } 16 17 return o; 18 19 } 20 21 var p1 = cPerson('瀚哲,'男','18'); 22 23 p1.show(); 24 25 var p2 = cPerson('丑小鸭','女','18'); 26 27 p2.show(); View Code (二)工厂方式的问题:使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的来源和类型),因此出现了构造函数。 二、构造函数模式 (一)实现方法: function CPerson ( name , sex , age

设计模式之工厂模式(简单工厂,工厂方法,抽象工厂)

时光总嘲笑我的痴心妄想 提交于 2019-11-28 06:12:16
前语:在工厂模式中常常会分不清楚(简单工厂和工厂方法,抽象工厂)三者之前的区别,在学习设计模式时也容易混淆,这里对三者进行学习; 工厂模式:顾名思义,客户希望通过工厂(一个或一系列方法)去生产(一个或者一系列产品的实例) 本质:工厂模式是创建者模式,创建对象实例; 一.简单工厂   简单工厂类(SimpleFactory)通过接受参数的形式,调用getShape()方法区得到想要创建的对象; 如图所示: 优点:简单而且粗暴的创建对象,通过参数可以创建任何实现了接口的对象 缺点:(1)当对象类过多,简单工厂就会很臃肿,不利于简单工厂的维护 (2)不符合开放封闭原则,每次增加一个产品子类,就需要修改简单工厂 简单写了一下实现代码:但是不是按照上述UML关系图 产品接口Food的代码如下 public interface Food { void eat(); } 实现产品接口的类Apple.class public class Apple implements Food { @Override public void eat() { System.out.println("当前吃是苹果"); } } 实现产品接口的类Pear.class public class Pear implements Food { @Override public void eat() { System.out

java设计模式----建造者模式

两盒软妹~` 提交于 2019-11-27 23:50:58
建造者模式使用场景:将复杂的实现与应用进行分离。主要有四个类:产品类(Product)、建造抽象类(Builder)、建造实现类(ConcreteBuilder)、指挥者类(Director)。建造者模式仅仅只比工厂模式多了一个“指挥类”的角色。在建造者模式图中,假如把这个指挥类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——指挥类。 产品类 package build; public class Product { private String food; private String water; public Product() { } public Product(String food, String water) { this.food = food; this.water = water; } public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getWater() { return water; } public void setWater

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

依然范特西╮ 提交于 2019-11-27 23:50:28
软件设计的要点是高内聚低耦合,而工厂模式则满足了这个要求,工厂模式分为三种:简单工厂模式(静态工厂类),工厂方法模式,抽象工厂模式。先上代码 简单工厂模式 1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 新建一个接口: package factory; public interface Interface { public void operate(); } 再建两个实现类: package factory; public class Impl implements Interface{ @Override public void operate() { System.out.println("实现接口方法"); } } package factory; public class Impl1 implements Interface{ @Override public void operate() { System.out.println("Impl1实现接口方法"); } } 工厂类: package factory; /** * 工厂方法 *

HeadFirst 设计模式

 ̄綄美尐妖づ 提交于 2019-11-27 23:17:09
一、设计原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间的松紧耦合设计而努力 对扩展开放,都修稿关闭 依赖抽象,不要依赖具体类 最少知识原则:之和朋友交谈 好莱坞原则:别找我,我会找你(由超类主控一切,当他们需要的时候,自然回去调用子类) 类应该只有一个改变的理由 二、设计模式 策略模式 定义算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户 2. 观察者模式 在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新 3. 装饰者模式 动态的将责任附加到对象上。想哟啊扩展功能,装饰者提供有别于继承的另一种选择 要点: 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式 在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代码 组合和委托可用于在运行时动态地加上新的行为 除了继承,装饰者模式也可以让我们扩展行为 装饰者模式意味着一群装饰者类,这些类用来包装具体组件 装饰者类反应出被装饰者的组件类型(事实上,他们具有相同的类型,都是经过接口或继承实现) 装饰者可以被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的 可以用无数个装饰者包装一个组件 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

工厂模式、抽象工厂

大憨熊 提交于 2019-11-27 20:08:29
1 /** 2 * 最初的设计 3 */ 4 Pizza orderPizaa(String type){ 5 Pizza pizza; 6 /* 7 *此代码没有对修改封闭 8 *压力来自于增加更多的比萨类型 9 */ 10 if(type.equals("cheese")){ 11 pizza = new CheesePizza(); 12 } else if(type.equals("greek")){ 13 pizza = new GreekPizza(); 14 } else if(type.equals("pepperoni")){ 15 pizza = new PepperoniPizza(); 16 } 17 18 pizza.prepare(); 19 pizza.bake(); 20 pizza.cut(); 21 pizza.box(); 22 return pizza; 23 } 24 /** 25 *建立一个简单工厂 26 */ 27 public class SimplePizzaFactory{ 28 public Pizza createPizza(String type){ 29 Pizza pizza = null; 30 31 if(type.equals("cheese")){ 32 pizza = new CheesePizza(); 33

GOF23-工厂模式

让人想犯罪 __ 提交于 2019-11-27 14:05:31
1.什么是工厂模式 就是实现创建者与调用者分离,工厂模式的核心(灵魂)其实就是: 分工。 2.工厂模式有哪些 简单工场模式(静态工厂) 简单工厂模式也叫静态工厂模式,就是工厂类一般使用静态方法,通过接受的参数的不同来创建不同的对象并返回。其缺点是对新增的业务类无能为力,必须要修改代码来完成扩展(不满足OCP原则)。 我们先来看下没有工程类的情况 测试类Main方法及测试结果: 我们可以看出创建对象要直接与Audi、BMW类直接打打交道。 我们再来看使用简单工厂类 可以看出,测试类并没有直接跟Audi、BMW类“直接打交道”,而是通过CarFactory来达到目的,可以理解创建对象的活已经交给CarFactory来做,不再由测试类直接创建(这也就是所谓的控制反转)。 工厂方法模式 创建工厂类接口,通过新增业务类,来满足新功能(满足OCP原则),缺点:结构变得更加复杂,代码更加复杂,理论上工厂方法更优,但实际我们常用简单工厂模式。 我们需要创建一个工厂接口,及对应工厂实现类。 测试类及结果 可以看出,我们是通过新增产品工厂类来实现产品对象的创建,试下如果要新增一个保时捷对象,我们此时需要怎么做?其实我们只需要新增一个保时捷的工厂类(实现CarFactory)即可。与简单工厂模式相比较:工厂方法模式结构更复杂(需要多个产品类),代码上也相对复杂,管理难度大(维护起来麻烦)。 抽象工厂模式

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

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

设计模式(单例模式、工厂、简单工厂、抽象工厂、代理模式、装饰者模式、观察者模式、适配器模式)

☆樱花仙子☆ 提交于 2019-11-27 12:50:55
一、单例模式 二、代理模式 一、单例模式 1.单例模式的定义 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 2.单例模式的特点 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 3.单例模式的应用 在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。 这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态。 4.单例模式的Java代码 单例模式分为懒汉式(需要才去创建对象)和饿汉式(创建类的实例时就去创建对象)。 5.饿汉式 属性实例化对象 //饿汉模式:线程安全,耗费资源。 public class HugerSingletonTest { //该对象的引用不可修改 private static final HugerSingletonTest ourInstance = new HugerSingletonTest(); public static HugerSingletonTest getInstance() {

观察者模式,单例模式和工厂模式

谁都会走 提交于 2019-11-27 07:56:09
持续更新中... 观察者模式: ( https://blog.csdn.net/colinandroid/article/details/81113013 ) 观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。 Subject:就是“被观察”的角色,它将所有观察者对象的引用保存在一个集合中。 (1)保存注册的观察者对象 (2)注册观察者对象 (3)注销观察者对象 (4)通知所有注册的观察者对象 Observer:是抽象的“观察”角色,它定义了一个更新接口,使得在被观察者状态发生改变时通知自己。 ConcreteObserver:具体的观察者。 单例模式: ( https://blog.csdn.net/q_all_is_well/article/details/82377917 ) 实现特点: (1)私有化该类的构造函数 (2)通过new在本类中创建一个本类对象 (3)定义一个公有的方法,将在该类中所创建的对象返回 实现方法: (1)单例模式的饿汉式 (2)单例模式懒汉式双重校验锁 (3)内部类 工厂模式: ( https://blog.csdn.net/u012156116/article/details/80857255 ) 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类