本文共 4116 字,大约阅读时间需要 13 分钟。
工厂模式(抽象类)
工厂模式更多的场景是在电商领域的应用是非常广泛的了。
工厂模式主要分为三种:
- 简单工厂模式;
- 工厂方法模式;
- 抽象工程模式;
1 简单工厂模式
简单工厂就是把实例化的操作单独放到一个类中,这个类就成为了简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。
比如工厂是鼠标工厂,专业生产鼠标,给参数0,生产戴尔鼠标;给参数1,生产惠普鼠标。
商品类
abstract class Product{ public String name; public Product(String name) { this.name = name; } }class Product1 extends Product{ public Product1(String name) { super(name); } }class Product2 extends Product{ public Product2(String name) { super(name); // TODO Auto-generated constructor stub } }
简单工厂类
// 简单工厂public class SimpleFactory { public static void main(String[] args) { int type = 1; Product product = null; if(type==1) { product = new Product1("product1"); }else if(type==2) { product = new Product1("product2"); } // 输出 System.out.println(product.name); }}
静态工厂的例子来创建的对象:
- 简单工厂类里面包含的:
- 商品的类型有哪些?
- 创建商品的方法有哪些?
这里的简单工厂就是可以根据类型不同来创建不同的商品,但是有一个问题?就是我每增加一种类型就是要修改createProduct方法中的if else方法。
反射来实现工厂模式
用一个hashMap来存储商品的类型,以及该商品的类别。
一个添加方法的方法,即往hashMap中存储类型以及product;
商品的创建过程更改为通过反射来创建了:即传入type之后,先通过hashMap来获取,之后类.newInstance创建好对象了。
另外一种就是直接注册商品对象
hashMap中不存储类了,而是存储具体的实例化商品对象了。
2 工厂方法模式
工厂方法模式是对上述简单工厂模式中的静态工厂模式的一种改进,工厂类被抽象话,需要具体特定化的逻辑代码转移到实现抽象方法的子类中,这样就不用再去修改工厂类了。(即不用再去if else修改了),这也是当前比较常用的一种方法。
有一个鼠标工厂作为父类,有生产鼠标这个接口;
戴尔鼠标工厂,惠普鼠标工厂继承工厂类,分别生产戴尔鼠标和惠普鼠标;
生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由具体的鼠标工厂创建。
商品类
abstract class Product{ public String name; public Product(String name) { this.name = name; } }class Product1 extends Product{ public Product1(String name) { super(name); } }class Product2 extends Product{ public Product2(String name) { super(name); // TODO Auto-generated constructor stub } }
工厂方法类
// 抽象工厂abstract class Factory{ // 抽象方法生成商品 abstract public Product factoryMethod();}// 具体工厂类一个工厂生产一个商品class FactoryProduct1 extends Factory{ @Override public Product factoryMethod() { return new Product1("product1"); }}class FactoryProduct2 extends Factory{ @Override public Product factoryMethod() { // TODO Auto-generated method stub return new Product2("product2"); } }
3 抽象工厂模式
工厂方法类中只有一个抽象方法,要想实现多种不同的类对象,只能去创建不同的具体工厂方法的子类来实列化,而抽象工厂 则是让一个工厂负责创建多个不同类型的对象
通过例子来通俗易懂的理解:
抽象工厂模式就是不仅生产鼠标,同时生产键盘。
PC厂商是个父类,有生产鼠标、生产键盘两个接口;
戴尔工厂,惠普工厂继承父类工厂,可以分别生产戴尔鼠标+戴尔键盘和惠普鼠标+惠普键盘。
商品类:
//商品类abstract class Product{ private String name; public Product(String name) { this.name = name; }}// 抽象的鼠标类abstract class Mouse extends Product{ public Mouse(String name) { super(name); } }// 抽象的键盘类abstract class KeyBoard extends Product{ public KeyBoard(String name) { super(name); } }// 具体的戴尔鼠标class DMouse extends Mouse{ public DMouse(String name) { super(name); }}// 具体的惠普鼠标class HMouse extends Mouse{ public HMouse(String name) { super(name); } }// 具体的戴尔键盘class DKeyBoard extends KeyBoard{ public DKeyBoard(String name) { super(name); }}// 具体的惠普键盘class HKeyBoard extends KeyBoard{ public HKeyBoard(String name) { super(name); }}
工厂类:
// 工厂抽象abstract class Factory{ // 生产产品1 public abstract Product createMouseProduct(); // 生产产品2 public abstract Product createKeyBoardProduct();}// 戴尔工厂class DellFactory extends Factory{ @Override public Product createMouseProduct() { return new DMouse("dell mouse"); } @Override public Product createKeyBoardProduct() { return new DKeyBoard("dell keyboard"); } }// 惠普工厂class HFactory extends Factory{ @Override public Product createMouseProduct() { return new HMouse("hp mouse"); } @Override public Product createKeyBoardProduct() { return new HKeyBoard("hp keyboard"); } }
4 工厂方法模式与抽象工厂模式的区别是什么?
工厂方法模式:
- 一个抽象产品类,可以派生出多个具体产品类;
- 一个抽象工厂类,可以派生出多个具体工厂类;
- 每个具体工厂类只能创建一个具体产品类的实例;
抽象工厂模式:
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;
- 一个抽象工厂类,可以派生出多个具体工厂类;
- 每个具体工厂类可以创建多个具体产品类的实例;
区别:
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个;
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
例子:
- 简单工厂模式:
- 一个抽象的产品类;
- 一个具体的惠普鼠标类;
- 一个具体的戴尔鼠标类;
- 一个具体的工厂类:在此处根据类型通过if-else来选择创建哪一个产品;
- 一个抽象的产品类;
- 工厂方法模式:
- 一个抽象的产品类;
- 一个具体的惠普鼠标类;
- 一个具体的戴尔鼠标类;
- 一个抽象的工厂类
- 一个具体的生产惠普鼠标的工厂类;
- 一个具体的生产戴尔鼠标的工厂类;
- 一个抽象的产品类;
- 抽象工厂模式:
- 一个抽象的产品类;
- 一个抽象的鼠标产品类;
- 一个具体的戴尔鼠标类;
- 一个具体的惠普鼠标类;
- 一个抽象的键盘产品类;
- 一个具体的戴尔鼠标类;
- 一个具体的惠普鼠标类;
- 一个抽象的鼠标产品类;
- 一个抽象的工厂类;
- 一个具体的戴尔工厂类;
- 一个具体的惠普工厂类;
- 一个抽象的产品类;
转载地址:https://codingchaozhang.blog.csdn.net/article/details/116737623 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!