抽象工厂模式、工厂方法模式总结

简单工厂模式、工厂方法模式与抽象工厂模式

之前一直没有时间对工厂模式进行总结,这里我梳理一下,我在网络上查看资料,发现每个文章的思路都不一样,这里我对其进行总结。

简单工厂模式

1. 简单工厂模式的定义

简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的“消费”和生产完全分开,客户端只需要知道自己需要什么产品,如何来使用产品就可以了,具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。

2. 简单工厂模式的构成
  • 具体的工厂角色:Factory;在工厂中可以调用方法生产出具体的某个类型的产品
  • 抽象的产品角色:Product;在抽象产品类型中可以声明抽象接口,在具体的产品类中实现;
  • 具体的产品角色:ProductA 和ProdcutB;在具体的类中必须实现抽象类的接口,也可以实现自己的业务逻辑
3. 简单工厂模式的UML
SimpleFactory.png
4. 代码实现
//抽象产品类
public abstract class Prodcut {
    //抽象产品方法
    public abstract sayHi();
}

//继承抽象类实现产品A类
public class ProductA extends Product {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductA");
    }
}

//继承抽象类实现产品A类
public class ProductB extends Product {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductB");
    }
}

public class Factory {
    
    public Factory() {
        
    }
    
    //第一种写法
    //根据产品名称生产产品
    public Product createProduct(String productName) {
        Product product = NULL;
        
        switch(productName){
            case "A":
                product = new ProductA();//生产产品A
                break;
                
            case "B":
                product = new ProductB();//生产产品B
                break;
                
            default:
                break;
                
        }
        return product;
    }
    
    //第二种写法
    //生产产品A
    public ProductA createProductA() {
        return new ProductA();//生产产品A
    }
    
    //生产产品B
    public ProductB createProductB() {
        return new ProductB();//生产产品B
    }
}
5. 简单工厂模式的优点与缺点:
  • 优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。
  • 缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则

工厂方法模式

1. 工厂方法模式的定义

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过工厂父类定义负责创建产品的公共接口,子类负责生产具体对象

2. 解决的问题

解决简单工厂模式的弊端,实现父类定义公共实现接口,子类负责实现创建具体的对象,这样就可以实现增加产品类时,不需要修改工厂类,而只需要修改工厂子类

3. 工厂方法模式的构成
  • 抽象产品类:Product;描述具体产品的公共接口,在具体的产品类中实现
  • 具体产品类:ProductA和ProductB;具体产品类,实现抽象产品类的接口,工厂类创建对象
  • 抽象工厂类:Factory;描述具体工厂的公共接口
  • 具体工厂类:FactoryA和FactoryB;描述具体工厂类,实现创建产品类对象,实现抽象工厂类的接口
4. 工厂方法模式的UML
FactoryMethod.png
5. 代码实现
//抽象产品类
public abstract class Prodcut {
    //抽象产品方法
    public abstract sayHi();
}

//继承抽象类实现产品A类
public class ProductA extends Product {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductA");
    }
}

//继承抽象类实现产品A类
public class ProductB extends Product {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductB");
    }
}

//工厂抽象类
public abstract class Factory {
    //抽象工厂方法
    public abstract Product createProduct();
}

//具体工厂类FactoryA
public class FactoryA extends Factory {
    
    @Overide
    public Product createProduct() {
        System.out.println("生产了一个A");
        return new ProductA();//生产产品A
    }
}

//具体工厂类FactoryB
public class FactoryB extends Factory {
    
    @Overide
    public Product createProduct() {
        System.out.println("生产了一个B");
        return new ProductB();//生产产品B
    }
}

6. 工厂方法模式的优点与缺点
  • 优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品
  • 缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类

抽象工厂模式

1. 抽象工厂模式的定义

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。这里的抽象角色就是产品族。后面我会单独讲解产品族的概念。
抽象工厂,非常适合解决两个维度的组合产品的构造问题,取其中一个维度作为产品族,另外一个维度作为产品族中具体的多个产品。

2. 产品族

产品族是具有相同属性的同类型产品;如宝马车,宝马1系,宝马2系,都属于宝马;

3. 解决的问题

由于产品族可能会有很多产品,这样的话如果按照工厂方法模式的写法,那样就需要每次添加一个产品类和工厂类;这样就会添加很多类文件,这里抽象工厂模式,其实就是将产品抽象成产品族,一个产品可能具有不同属性,这里工厂类只需要产品属性的共性抽象出来。

4. 抽象工厂模式的构成
  • 抽象工厂角色:是具体工厂角色必须实现的接口或者必须继承的父类。。
  • 具体工厂角色:继承抽象工厂类,实现创建对应的具体产品的对象。
  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。这里抽象产品至少2个维度;
  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
5. 抽象工厂模式的UML
AbstractFactory.png
6. 代码实现
//抽象形状类
public abstract class Shape {
    public abstract void sayShape();
}

//矩形类
public class Retangle extends Shape {
    
    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Retangle!");
    }
}

//圆形类
public class Circle extends Shape {

    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Circle!");
    }
}

//抽象颜色类
public abstract class Color {
    public abstract void sayColor();
}

//红色类
public class Red extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm Red!");
    }
}

//白色类
public class White extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm White!");
    }
}

//抽象工厂类
public abstract class ShapeFactory {

    public abstract Shape createShape();
    
    public abstract Color createColor();
}

//红色的圆
public class RedCircleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Circle();
    }
    
    @Overide
    public Color createColor() {
        return new Red();
    }
}

//白色的圆
public class WhiteCircleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Circle();
    }
    
    @Overide
    public Color createColor() {
        return new White();
    }
}
7. 抽象工厂模式的优点与缺点
  • 优点:1.当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。2.保证减少工厂类和具体产品的类添加
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 工厂和抽象产品里加代码,又要在具体的里面加代码。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容