Elasticsearch 创建以及修改索引结
605 2023-04-03 02:40:39
简单工厂设计模式---透彻讲解
理解简单工厂设计模式, 首先要理解什么是工厂. 我们身边有很多工厂. 酿酒的酒厂, 制衣的衣厂, 加工肉类的肉加工厂等等. 这些工厂他们到底是怎么酿酒的? 怎么制衣的?怎么加工肉的? 我们并不知道, 也不需要知道. 不知道并不影响我们喝酒, 穿衣, 吃肉. 这就是工厂的特点之一: 客户不需要知道怎么做的, 但是不影响使用
再来看看工厂的第二个特点: 比如肉加工厂---双汇. 牛肉进去出来牛肉火腿肠, 羊肉进去出来羊肉火腿肠, 猪肉进去出来猪肉火腿肠. 我不需要知道怎么加工的, 我只需要把材料扔进去, 然后对应的火腿肠就出来了. 这就是第二个特点: 给你材料, 你去制造出我想要的东西, 至于怎么做, 我并不关心.
程序中的工厂也是一样的思想. **工厂的作用就是创造对象. **
我们基本都知道设计模式有23种, 说到这, 我们先来说说设计模式。
设计模式不是语法, 而是一种巧妙的写法, 能够把程序变得更加灵活的写法.
设计模式有三种: 创建型, 行为型, 结构型. 简单工厂设计模式属于创建型. 但简单工厂设计模式不属于23种设计模式范围内, 属于23种设计模式中工厂设计模式里最简单的一种.
简单工厂设计模式, 又叫做静态工厂设计模式. 简单工厂设计模式提供一个创建对象实例的功能,而无需关系其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。
这个很重要, 这也是创建一个简单工厂的步骤
以上类型就描述了一个简单工厂创建的整个过程
第一步: 定义API接口或抽象类, 并定义一个operate操作方法
第二步: 定义API的实现类, 每个实现类单独实现operate方法
第三步: 定义工厂类. 工厂类依赖API接口和API的实现类, 简单工厂设计模式是创建型的, 通常是用来创建实体类. 因此我们定义一个create方法, 来创建实例对象,入参通常是一个指定的类型
第四步: 定义客户端. 客户端传入一个指定的类型给工厂, 工厂就会创建出对应的实现类.
第一步: 制衣厂API接口
package com.lxl.www.designPatterns.simpleFactory.demo;public interface IClothes { void operate();}
第二步: 制衣厂API实现类ManClothes: 制作男士衣服
package com.lxl.www.designPatterns.simpleFactory.demo;public class ManClothes implements IClothes{ @Override public void operate() { System.out.println("制作男人的衣服"); }}
WomenClothes: 制作女士衣服
package com.lxl.www.designPatterns.simpleFactory.demo;public class WomenClothes implements IClothes{ @Override public void operate() { System.out.println("制作女人的衣服"); }}
ChildClothes: 制作儿童衣服
package com.lxl.www.designPatterns.simpleFactory.demo;public class ChildClothes implements IClothes{ @Override public void operate() { System.out.println("制作儿童的衣服"); }}
第三步: 定义工厂, 并创建衣服类接口
package com.lxl.www.designPatterns.simpleFactory.demo;/** * 制衣工厂 */public class ClothesFactory { public static IClothes createClothes(String type) { if (type.equals("男人")) { return new ManClothes(); } else if (type .equals("女人")) { return new WomenClothes(); } else { return new ChildClothes(); } }}
第四步: 定义客户端, 指定制衣类别, 制衣.
public static void main(String[] args) { IClothes manClothes = ClothesFactory.createClothes("男人"); manClothes.operate(); }
提供一个创建对象实例的功能,而无需关心其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。
简单工厂方法的内部主要实现的功能是 ** “选择合适的实现类” **,选择条件或者是参数的来源通常为以下几种:
1.可能增加客户端的复杂度
2.不方便扩展子工厂
3. 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
4. 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
5. 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。