23种设计模式-工厂模式
23种设计模式-工厂模式
前言:
【我们为什么需要使用工厂模式?】
/*** 在使用工厂模式之前,我们要创建 实现了相同接口的对象 都需要直接new(),如下* */@Testpublic void testAlong(){//要获取CatCat cat=new Cat();//要获取DogDog dog=new Dog();}
public interface Animal {//喊public void call();
}public class Cat implements Animal {@Overridepublic void call() {System.out.println("my name is cat");}
}public class Dog implements Animal {@Overridepublic void call() {System.out.println("My name is Dog");}
}
- 简单工厂模式(不属于23种设计模式)
【V1版本】
public class AnimalFactoryV1 {/*** 根据Animal Name来判断创造哪一个*/public Animal providerAnimal(String animalName){if("Cat".equals(animalName)){return new Cat();}else if ("Dog".equals(animalName)){return new Dog();}return null;}
}
/*** 在使用简单工厂模式之后* V1 版本** 优点:可以根据 选择来决定要创建的对象* 缺点:但如果我要增加一个 Pig,还要改动工厂,就违背了开闭原则* */@Testpublic void testFactoryV1(){AnimalFactoryV1 animalFactoryV1=new AnimalFactoryV1();Animal cat = animalFactoryV1.providerAnimal("Cat");cat.call();}
【V2版本】
public class AnimalFactoryV2 {public Animal providerAnimal(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {Animal o = (Animal)Class.forName(className).newInstance();return o;}
}
/*** 简单工厂模式2.0* 想一个可以不用改动工厂类的方法** 优点:符合开闭原则* 缺点:输入参数是全类名,可以稍微升级一下这版本的简单工厂模式* */@Testpublic void testFactoryV2() throws IllegalAccessException, InstantiationException, ClassNotFoundException {AnimalFactoryV2 animalFactoryV2=new AnimalFactoryV2();Animal cat = animalFactoryV2.providerAnimal("designmodel.factory.singleFactory.Cat");cat.call();//这时候增加一个类 就只需要变动传入的类名,无需变动工厂,符合开闭原则Animal pig =animalFactoryV2.providerAnimal("designmodel.factory.singleFactory.Pig");pig.call();}
【V2.5】
public class AnimalFactory2p5 {public Animal providerAnimal(Class <?extends Animal> classType) throws IllegalAccessException, InstantiationException {Animal o = classType.newInstance();return o;}
}
/*** 工厂模式2.5* 优点:可以根据Class去判断创建指定的对象* 缺点:缺点(也是简单工厂的缺点) 创建者能明白我要创建的类。* 这操作就和:你拿了一个鸭子玩具的设计稿 去工厂里说,给我用这个设计稿做个鸭子玩具出来* ????怪不怪,生活中怎么可能这样,生产都是工厂负责的,消费者就根据需求去不同工厂取对象就好。* */@Testpublic void testFactoryV2p5() throws IllegalAccessException, InstantiationException, ClassNotFoundException {AnimalFactory2p5 animalFactoryV2p5=new AnimalFactory2p5();Animal cat = animalFactoryV2p5.providerAnimal(Cat.class);cat.call();}
【所以这时候我们的 工厂方法模式 就出现了】
- 工厂方法模式
public interface IAnimalFactory {//提供动物接口public Animal provider();
}public class CatFactory implements IAnimalFactory{@Overridepublic Animal provider() {return new Cat();}
}public class DogFactory implements IAnimalFactory{@Overridepublic Animal provider() {return new Dog();}
}
public class FactoryMethodMain {@Testpublic void test01(){CatFactory catFactory = new CatFactory();catFactory.provider().call();}
}
输出:my name is cat
优点:没有把Animal暴露给 消费者,消费者想要买啥就去对应的工厂
缺点 :太可怕了!我想要买猫,就要去猫厂。要买狗就要去狗厂,那全国各地不是都是细分的产品的工厂了吗?(需要建立的工厂类太多了)
为了解决这个问题,抽象工厂模式就出现了
- 抽象工厂模式
新增Book类型,以及他的实现类
public interface IBook {public void see();
}public class ChinaBook implements IBook{@Overridepublic void see() {System.out.println("I like ChinaBook");}
}public class EnglishBook implements IBook{@Overridepublic void see() {System.out.println("I like EnglishBook");}
}
这时候如果用工厂方法模式,就要创建4个Factory出来,但是用抽象工厂模式
public interface IBookFactory {public IBook print(String bookName);
}public class BookFactory implements IBookFactory{@Overridepublic IBook print(String bookName) {if("China".equals(bookName)){return new ChinaBook();}else if("English".equals(bookName)){return new EnglishBook();}return null;}
}
public class Main {@Testpublic void test01(){//想要猫,就去动物工厂,告诉他你要什么动物AnimalFactory animalFactory=new AnimalFactory();animalFactory.provider("Cat").call();//想要书就去书的工厂,然后告诉他你要什么书BookFactory bookFactory=new BookFactory();bookFactory.print("China").see();}
}
PS:我的抽象工厂模式使用的是接口发方法,用抽象类是为了在在类中写常规的方法去赋值吧?这个我也不太懂。个人理解就是(以玩具,电器为例子)
【没有工厂】:我要玩具,就自己用模板去造一个(new Class())
【简单工厂】:我要玩具,就给工厂提供模板(Class),让工厂替我造,实现部分解耦
【工厂方法】:我要芭比娃娃玩具,就和去对应的芭比娃娃工厂,想要擎天柱就去对应的擎天柱工厂,想要冰箱就去冰箱工厂。实现真正的解耦,但是巨麻烦,工厂贼多
【抽象工厂】:对工厂方法的一种封装整合,把相同业务的工厂集合在一起。
这是今天的见解,有错误的地方,还请多多指正
23种设计模式-工厂模式相关推荐
- 23种设计模式——工厂模式
文章目录 23种设计模式--工厂模式 1.工厂模式概述 2.简单工厂模式 2.1.简单工厂模式的优缺点 2.2.简单工厂模式的结构 2.3.简单工厂模式的实现 3.工厂方法模式 3.1.工厂方法模式的 ...
- 23种设计模式——工厂模式+适配器模式实战
一.简介 业务需求,需要对不同的浏览器返回不同的url地址. 例如: Chrom浏览器返回:'http://www.chrom.com', IE浏览器返回:'http://www.ie.com' 二. ...
- 23种设计模式----------代理模式(一)
代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者 ...
- 23种设计模式——桥接模式
文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...
- 23种设计模式常用模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...
- SSM源码分析之23种设计模式(策略模式和模板模式)
23种设计模式之策略模式和模板模式 目录 策略模式使用场景 策略模式实现 模板模式 目录 策略模式使用场景 策略模式:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法) ...
- 23种设计模式----模板方法模式----行为模式
模板方法模式 1.模板方法模式是什么 2.模板方法的组成 3.模板方法中不同的类的行为 4.例子 4.1 例子的背景 4.2模板类--父亲寻找继承人的方式 4.3实现类----孩子类 4.4测试类-- ...
- 23种设计模式----原型模式----创建型模式
原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...
- 23种设计模式——工厂方法模式
目录 回顾简单工厂模式 工厂方法模式 优缺点 工厂方法模式VS简单工厂模式 应用场景 实例 用工厂方法模式实现计算器 导出数据 回顾简单工厂模式 可以参考我的另一篇博客 工厂类角色LightSimpl ...
最新文章
- requests不容易注意到的细节收集~
- HDU 5861 Road 线段树区间更新单点查询
- 读书印记 - 《注意力经济:如何把大众的注意力变成生意》
- 单核工作法16:循序渐进(下)
- filter函数的用法_JavaScript中forEach和filter的用法和原理
- web前端面试问答_Web服务面试问答
- java给图片坐标描点,记录一下, canvas实现获取图片每个坐标点,以描点方式渲染图片...
- Android学习笔记-判断手机外部存储是否可读写
- 牛客 XOR和(找规律)
- 变步长的梯形求积法matlab,基于MATLAB的变步长梯形数值积分法的研究与实验
- 机器学习笔记(十三):主成分分析法(PCA)
- jq实现点击复制文本功能
- Vue项目调用扫一扫功能 亲测好用!!!
- UA MATH564 概率分布2 Poisson分布
- 浏览器工作原理:浅析HTTP请求流程
- The server time zone value ‘й‘ is unrecognized or represents more than one time zone
- MySQL缓冲池-Buffer Pull
- 笔记本电脑“伪黑屏”故障原因
- jpg格式电脑怎么弄_jpg格式-怎么把图片弄成JPG格式?同上 – 手机爱问
- 字符串转日期,日期转字符串,日期比较
热门文章
- java最大子序列和问题_一文看懂《最大子序列和问题》(内含Java,Python,JS代码)...
- java中setattr功能_Java Controller.setAttr方法代码示例
- MPC 101:安全多方计算与多方签名
- C++头文件sstream笔试常见用法
- 【Java开发】Spring Cloud 03 :Spring Boot 项目搭建
- excel导入到html和从html导出文件到excel
- Linux——根据pid获取端口号
- 国信长天嵌入式竞赛平台软件及驱动安装
- 判定表与判定树的画法_判定表,判定树是神魔
- 公网服务器系统重名,服务器 重名处理