设计模式之工厂模式

算法潮涌
• 阅读 1537

估计这个系列的文章是每篇一个设计模式,重点是为了让大家能够利用休闲时间,比如说5分钟就能够比较全面通俗易懂地了解设计模式。

前言

接下来就是手撕设计模式的环节了,设计模式本身并不难,难的是在实际情况下是否能自然地想到使用设计模式。简单来说设计模式的本质是一种思想,一种重构代码,使代码高可用的思想。

在面向对象设计(写代码)的时候一般会遵循以下几个原则,当然初学肯定很难遵循,但是至少得了解是什么,然后有意识地往这个方向靠。

  • 单一职责原则: 一个类只负责具体的某一个功能,当新需求出现的时候,最好的做法是增加一个类而不是修改原来的类。
  • 开闭原则: 当开发好一个类后,这个类需要有良好的扩展性,可以通过继承和多态来添加新功能。
  • 里氏替换原则: 把父类换成子类,程序不会报错,但是反过来就不行。通俗地来讲,子类能够扩展父类的功能,但是不能改变原来父类原有的功能。
  • 接口隔离原则: 客户端不应该依赖于它所不需要的接口,设计接口时尽量精简单一。
  • 依赖倒置原则: 高级模块不应该依赖低级模块,两者都给应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。

这些理论的东西我已经尽可能简单地讲了

设计模式之工厂模式

工厂及抽象工厂模式


有关工厂模式有三种,简单工厂,工厂,抽象工厂,通常来说,前面两者并为一项说工厂模式。

那么什么叫工厂模式呢,最简单来说,你没必要和产品打交道,你直接和工厂打交道,把new 产品的操作交给工厂来做。

1、简单工厂模式


之所以简单,是因为它只涉及到具体工厂类,抽象产品类和具体产品类,下面直接来看代码。

抽象产品类:

手机

public abstract class AbstractPhone {
    public abstract void use();
}

具体产品类:

魅族手机和一加手机

public class Meizu extends AbstractPhone{
    @Override
    public void use() {
        System.out.println("正在使用魅族手机");
    }
}
public class OnePlus extends AbstractPhone {
    @Override
    public void use() {
        System.out.println("正在使用一加手机");
    }
}

具体工厂类:

生产手机的工厂

public class PhoneFactory {
    public AbstractPhone createPhone(String brand) {
        if(brand.equals("一加")) {
            return new OnePlus();
        } else if(brand.equals("魅族")) {
            return new Meizu();
        } else {
            System.out.println("没有该品牌的生产权");
            return null;
        }
    }
}

测试类:

@Test
public void test01() {
    //新建一个工厂
    PhoneFactory factory = new PhoneFactory();            
    
    //我们不必要跟产品打交道,告诉工厂需要一部一加手机即可
    AbstractPhone onePlus = factory.createPhone("一加");    
    onePlus.use();

    AbstractPhone meiZu = factory.createPhone("魅族");
    meiZu.use();
}

以上就是简单工厂的实现方式,总结就是

  1. 有个抽象产品类或者接口
  2. 具体产品继承或者实现抽象产品
  3. 具体工厂类,根据需求生产产品

UML类图:

设计模式之工厂模式

2、工厂模式


现在问题来了,如果这个工厂继续和小米,华为合作的话

设计模式之工厂模式

开玩笑开玩笑,除了具体产品类需要增加,是不是也需要修改具体工厂类,这是我们不希望看到的。设计好的类,最好就是不要是在增加需求的时候改变类。

所以想到了把生产工厂抽象化,需要增加小米,只需要添加一个小米的生产类,而不改动已有的工厂类。这样就是工厂模式。

需要抽象产品类,具体产品类,抽象工厂类,具体工厂类

抽象产品类:

和上面用的是一样的抽象产品,这里不再赘述

具体产品:

同样是魅族和一加手机

抽象工厂类:

public abstract class AbstractPhoneFactory {
    public abstract AbstractPhone createPhone();
}

具体工厂类:

这个例子中有两个具体工厂类,生产魅族手机的工厂和一加手机的工厂

public class OnePlusFactory extends AbstractPhoneFactory {
    @Override
    public OnePlus createPhone() {
        return new OnePlus();
    }
}
public class MeizuFactory extends AbstractPhoneFactory {
    @Override
    public Meizu createPhone() {
        return new Meizu();
    }
}

测试类:

@Test
public void test02() {
    OnePlusFactory onePlusFactory = new OnePlusFactory();
    onePlusFactory.createPhone().use();

    MeizuFactory meizuFactory = new MeizuFactory();
    meizuFactory.createPhone().use();

}

就算之后需要增加一个小米手机类,只需要添加具体产品类,具体工厂类,并不需要修改已有的类。

类图:

设计模式之工厂模式

3、抽象工厂模式


如果现在需求继续增加,但是不是增加品牌种类,而是。魅族和一加希望更准确地找到市场定位,所以都推出了中端手机和高端旗舰手机来冲击市场,这时候我们应该怎样设计呢。

这时候抽象工厂类不是单纯地生产手机,而是需要生产一个产品族

产品族是以产品平台为基础,通过添加不同的个性模块,以满足不同客户个性化需求的一组相关产品。

中端手机和旗舰手机就是一个产品族。

总的来说,通俗地来讲就是魅族工厂需要生产魅族的中端手机和魅族的高端手机,一加工厂需要生产一加的中端手机和高端手机。

需要抽象工厂类,具体的抽象工厂类,抽象产品类,产品族具体的抽象产品类,具体产品类

抽象产品类:

public abstract class AbstractPhone {
    public abstract void use();
}

产品族具体的抽象产品类:

中端手机和旗舰手机

public abstract class AbstractMiddlePhone extends AbstractPhone {
    @Override
    public abstract void use();
}
public abstract class AbstractTopPhone extends AbstractPhone{
    public abstract void use();
}

具体产品类:

魅族的中端手机,旗舰手机;一加的中端手机,旗舰手机。

public class MeizuMiddlePhone extends AbstractMiddlePhone {
    @Override
    public void use() {
        System.out.println("魅族中端产品");
    }
}
public class MeizuTopPhone extends AbstractTopPhone {
    @Override
    public void use() {
        System.out.println("魅族高端旗舰");
    }
}
public  class OnePlusMiddlePhone extends AbstractMiddlePhone {
    @Override
    public void use() {
        System.out.println("一加中端产品");
    }
}
public class OnePlusTopPhone extends AbstractTopPhone {
    @Override
    public void use() {
        System.out.println("一加高端旗舰");
    }
}

抽象工厂类:

public abstract class AbstractFactory {
    public abstract AbstractPhone createMiddlePhone();

    public abstract AbstractPhone createTopPhone();
}

具体抽象工厂类:

魅族生产工厂,一加生产工厂

public class MeizuFactory extends AbstractFactory {
    @Override
    public MeizuMiddlePhone createMiddlePhone() {
        return new MeizuMiddlePhone();
    }

    @Override
    public MeizuTopPhone createTopPhone() {
        return new MeizuTopPhone();
    }
}
public class OnePlusFactory extends AbstractFactory {
    @Override
    public OnePlusMiddlePhone createMiddlePhone() {
        return new OnePlusMiddlePhone();
    }

    @Override
    public OnePlusTopPhone createTopPhone() {
        return new OnePlusTopPhone();
    }
}

测试类:

@Test
public void test03() {
    OnePlusFactory onePlusFactory = new OnePlusFactory();
    MeizuFactory meizuFactory = new MeizuFactory();
    onePlusFactory.createMiddlePhone().use();
    onePlusFactory.createTopPhone().use();

    meizuFactory.createMiddlePhone().use();
    meizuFactory.createTopPhone().use();

}

类图:

设计模式之工厂模式

点赞
收藏
评论区
推荐文章
happlyfox happlyfox
4年前
笑说设计模式-小白逃课被点名
关于我简介工厂模式(FactoryPattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。分类工厂模式可以分为三种,其中简单工厂一般不被认为是一种设计模式,可以将其看成是工厂方法的一种特殊
Wesley13 Wesley13
3年前
java24种设计模式
一、设计模式定义  设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。二、设计模式分类  经典模式只有23个(还有简单工厂模式),它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。  根据它们的用
Wesley13 Wesley13
3年前
Java 设计模式(1)
设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种
Wesley13 Wesley13
3年前
Unity C# 设计模式(二)简单工厂模式
定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该
Wesley13 Wesley13
3年前
Java设计模式之工厂模式
!(https://oscimg.oschina.net/oscnet/6f017d3c54602a04b8f18764d2f821d15a8.gif)!(https://oscimg.oschina.net/oscnet/2fbf1028f14a926f1e569cf3b4e8fb8d710.gif) 前言工厂模式(Factor
Wesley13 Wesley13
3年前
Java中23种设计模式详解
Java中23种设计模式1\.设计模式31.1创建型模式41.1.1工厂方法41.1.2抽象工厂61.1.3建造者模式101.1.4单态模式131.1.5原型模式151.2结构型模式171.2.1适配器模式171.2.2桥接模式191.2.3组合
Wesley13 Wesley13
3年前
Java开发中的23种设计模式详解(转)
设计模式(DesignPatterns)                                 ——可复用面向对象软件的基础设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他
Wesley13 Wesley13
3年前
C#设计模式 —— 工厂模式
。  工厂模式同样是项目中最常用的设计模式,工厂模式中又分为简单工厂,工厂方法,抽象工厂。下面我们由简单的开始逐一介绍。1.简单工厂模式  简单工厂又被称为静态工厂,在设计模式中属于创建型模式。主要解决的问题是封装了实例化的过程,通过传入参数来获不同实例。下面我们举一个项目中可能会用到的例子。  假设我们程序的数据保存在几个不同
Wesley13 Wesley13
3年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Wesley13 Wesley13
3年前
23种设计模式(面向对象语言)
一、设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。所有的创建型模式都有两个主要功能:  1.将系统所使用的具体类的信息封装起来  2.隐藏
玩转Spring状态机 | 京东云技术团队
说起Spring状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一种实现,在介绍Spring状态机之前,让我们来看看设计模式中的状态模式。1\.状态模式状态模式的定义如下:状态模式(StatePat