三种工厂模式学习
工厂模式为什么要使用工厂模式
先看下面一段代码 public class SendMessageContrller { // @Autowired // private Producer producer; public void sendMsg(String msg) throws Exception { Producer producer = new Producer(); producer.sendByExchange("hi"); } }
我们常规的创建对象的方 new关键字 反射机制创建对象
那么这么做的 缺点 是什么呢? 对象创建和对象使用使用的职责耦合在一起,违反单一 原则; 当业务扩展时,必须修改代业务代码,违反了开闭原则;
我们可以使用工厂模式来创建对象,那么 工厂模式 有什么 优点 把对象的创建和使用的过程分开,对象创建和对象使用使用的职责解耦; 如果创建对象的过程很复杂,创建过程统一到工厂里管理,既减少了重复代码,也方 便以后对创建过程的修改维护; 当业务扩展时,只需要增加工厂子类,符合开闭原则;
工厂模式分为三种 简单工厂 工厂模式 抽象工厂 简单工厂
首先我们要生产的产品: public interface Fruit { int price(); void draw(); } public class Banana implements Fruit { private int price = 60; @Override public int price() { return price; } @Override public void draw() { System.out.print("仙人蕉"); } public void setPrice(int price) { this.price = price; } }
简单工厂类: /** * @Author: jimmy * @Date: 2021/9/15 14:45 * @Description: * 简单工厂 - 静态工厂模式 */ public class StaticFactory { // 产品标志 public static final int TYPE_APPLE = 1; public static final int TYPE_ORANGE = 2; public static final int TYPE_BANANA = 3; public static Fruit getFruit(int type){ if(TYPE_APPLE == type){ return new Apple(); } else if(TYPE_ORANGE == type){ return new Orange("Peter",80); } else if(TYPE_BANANA == type){ return new Banana(); } return null; } /** * 多方法工厂 * @return */ public static Fruit getFruitApple(){ return new Apple(); } public static Fruit getFruitOrange(){ return new Orange("Peter",80); } public static Fruit getFruitBanana(){ return new Banana(); } }
工厂测试类: public class FactoryTestClient { public static void main(String[] args) { System.out.println("--- 简单工厂模式 ---"); // 传入香蕉的标志,获取香蕉实例 Fruit fruit = StaticFactory.getFruit(StaticFactory.TYPE_BANANA); fruit.draw(); System.out.println( fruit.price()); } }
输出结果:
--- 简单工厂模式 --- 仙人蕉60
可以看到简单工厂有 3个角色 Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。 IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 Product:具体产品类,是简单工厂模式的创建目标。
简单工厂模式的优缺点
优点: 客户端无需知道具体的创建产品逻辑,只需要知道具体参数即可通过简单工程获取实例 实现了创建和应用的解耦
缺点: 所有的产品都集中在一个工厂中,一旦不能正常工作,整个系统都要受到影响 系统的扩展相对困难,一旦添加新的产品需要修改工厂的逻辑来解决新产品,这就破坏了开闭原则.产品较多的时候也容易造成混乱 使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构 工厂模式
工厂方法模式属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义在于定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,仅负责声明具体工厂子类必须实现的接口。这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
先上代码:
工厂类: // 工厂父类(接口) public interface FruitFactory { public Fruit getFruit(); } // 具体产品对应的工厂 public class AppleFactory implements FruitFactory{ @Override public Fruit getFruit(){ return new Apple(); } }
产品类(父类Fruit上面已经展示了) public class Apple implements Fruit { private int price = 100; public Apple(){} public Apple(int price){ this.price = price; } @Override public int price() { return price; } @Override public void draw() { System.out.print("苹果红富士"); } public void setPrice(int price) { this.price = price; } }
测试类 public class FactoryTestClient { public static void main(String[] args) { System.out.println("--- 工厂模式 ---"); FruitFactory fruitFactory = new AppleFactory(); Fruit f = fruitFactory.getFruit(); f.draw(); System.out.println(f.price()); } }
输出结果:
--- 工厂模式 --- 苹果红富士100
工厂模式角色 IFactory(Creator):抽象工厂类,描述了工厂的公共方法 Facotry(Concrete Creator): 具体创建者 IProduct(Product):抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 Product(Concrete Product):具体产品类,是简单工厂模式的创建目标。
优缺点
优点: 更加符合开闭原则,新增产品的时候只需要增加相应的产品和工厂类即可 符合单一职责,每个工厂仅负责创建单一产品 不再使用静态方式,这样可以使用继承等结构
缺点: 扩展需新增的内容较多,产品和工厂都要增加会增加系统的类数量 抽象工厂
不废话直接上代码 public abstract class AbstractFactory { // 获取水果 public abstract Fruit getFruit(); // 打包水果 public abstract Bag getBag(); } public class OrangeFactory extends AbstractFactory{ @Override public Fruit getFruit() { return new Orange("非鸽传书", 5); } @Override public Bag getBag() { return new OrangeBag(); } } /** * 包装接口 */ public interface Bag { void pack(); } /** * 桔子包装 */ public class OrangeBag implements Bag { @Override public void pack() { System.out.print("--桔子使用网兜包装"); } }
Test public class FactoryTestClient { public static void main(String[] args) { AbstractFactory factory = new OrangeFactory(); Fruit of = factory.getFruit(); of.draw(); Bag bag = factory.getBag(); bag.pack(); } }
输出:
--- 抽象工厂模式 --- 砂糖桔--桔子使用网兜包装
抽象工厂角色 AbstractProduct(抽象产品类):需要创建的产品的抽象类。 ConcreteProduct(具体产品类):为实现抽象产品的某个具体产品类。 AbstractFactory(抽象工厂类):工厂模式方法核心,创建一系列产品对象。 ConcreteFactory(具体工厂类):实现抽象工厂中定义的创建产品的方法。
抽象工厂在针对产品簇的时候比较常用,与工厂模式区别在于将抽象工厂定义为抽象类而不是接口,这样就规范了具体产品类的基本制造产品流程. 三种模式简单对比
类型
定义
用法
使用方式
简单工厂模式
一个用于创建对象的接口,让子类决定实例化那个类
生成一个复杂对象
工厂参数传递类型获取对应产品
工厂模式
一个用于创建对象的接口,让子类决定实例化那个类
生成一个复杂对象
使用对应产品的类型的工厂创建产品
抽象工厂模式
它为创建一组相关或者是相互依赖的对象提供一个接口
生成一组复杂对象
使用对应工厂创建一组产品
全新玲珑ID设计音质再升级,魅族POP3打造入门级TWS耳机新标准TWS耳机,应该是现在大部分人出行必备的利器吧!没错,由于其便携和易用性,成为了我们通勤旅途路上的好伙伴。目前,市面上的TWS耳机可以说是琳琅满目,且价格功能让人看得眼花缭乱,一不
真HIFI级的真无线耳机魔浪HiFiPods还记得数年前,铁三角森海这些动不动几千甚至几十万元级的HIFI有线耳机叱诧风云,让我们这些普通小白们摸着羞涩的腰包,渴望而不可及的时代吗?在那个时代,仿佛即使是有线耳机,咱们这些使
你心目中的大数据是什么样子的?您好,我是数据僧,在数据行业从业5年。我心目的中的大数据,在万物互联的情况下,同时每个人的个人信息能得到很好的保护。通过大数据生产出来的工具,应用遵循道德标准,合理的商业竞争标准,
有什么打电话好用的手机耳机?帮忙推荐一下,最好不是蓝牙的?由于现在很多手机都去掉了3。5mm耳机接口,所以选择蓝牙无线耳机是最理想的选择。但因为题主要求尽量推荐有线的,所以就有必要再顺着这个方向去延展一下。其实如果题主是iPhone的用户
vivo开发者大会将于12月16日举行从1到正无穷IT之家12月6日消息,vivo正式宣布2021开发者大会将于12月16日上午正式召开,主题是从1到正无穷,设有1个主会场6个专场,整体将采用线上直播的方式。在主会场当中,vivo
联想事件让你联想到了什么?任何企业法人都离不开毛泽东思想的深入学习和接受教育,否则知识分子也容易走向国家和人民的对立面,至于那些草根创业者,就更需要警钟长鸣,一旦离开了国家和人民的监督,都容易走向思想的堕落
红米Note11Pro充电速度全面测试,67W65W充电头快到没朋友红米Note11Pro充电速度测试总结除了原装120W,还试了小米67W65W氮化镓小米33W30W22。5W充电头。65W完美兼容快速,有点让人期待下一代67W但33W以下兼容不
联想真的有问题吗?用老百姓的话说,趁乱把国家的东西全部放进自己的口袋,尝到甜头后一发不可收拾。台底下的交易多了,现在被放到台面上了,在黑暗中生存了那么多年,能见光吗?最坏的是他这一套东西,影响了许多
教师如何投屏手写讲课?希沃白板5软件这个软件有电脑端(WINDOWS系统)和移动端(苹果和安卓),所有功能全部免费。一般情况下,电脑安装希沃白板软件,电脑屏幕内容同步输出到任何品牌的电子白板上,通过电子
魅族究竟有什么魔力,让人又爱又恨自智能手机这个概念出世以来,这块市场就从来没有安静过,不断有新的品牌进入,稍有不慎便产生了出局者。前前后后10年,霸主从来没有被谁垄断过,前有苹果三星,后有小米OV华为。但就是在这
推动智能时代传统产业数字化转型近年来,随着云计算大数据物联网等新一代信息技术蓬勃发展,人工智能技术迎来爆发式增长阶段。基于深度学习的人工智能算法在模式识别自然语言处理等方面的表现开始接近甚至超过人类智能,并已被