[版权申明] 非商业目的注明出处可自由转载
出自:shusheng007
设计模式汇总篇,一定要收藏:永不磨灭的设计模式
前言
人在IT江湖飘,不懂设计模式咋装X?
工厂模式相信大伙已经听的够够的了,这足以证明它的实用性。工厂模式一般有3种,今天研究的简单工厂模式不在GOF的经典23种设计模式之中,但它却足够简单,非常适合日常开发中解决相应场景的问题,人人都学的会。
创建型设计模式讨论的是如何创建对象的问题。就是以各种高逼格的方式最终将一个类的对象new出来,一点也不神秘,简单工厂模式就属于此类型。
类型
创建型(creational)
难度
1颗星
定义
简单工厂模式,又叫做静态工厂方法(Static Factory Method)模式,是由一个工厂对象决定创建出哪一种产品类的实例。
使用场景
最重要的知识点,这是最重要的知识点,这是最重要的知识点!不能利用技术来解决实际问题,技术将一文不值。
首先当然是在你需要new一个类的对象的时候,此时各种状况出现啦:
- 你不想直接new这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了。
- 这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程一遍又一遍的写在需要用到此对象的地方。
- 这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。
UML类图
下图是简单工厂方法模式的UML图
简单工厂模式就3个角色:
-
对象工厂(SimpleComputerFactory)
-
要生产的对象的接口(Computer)
-
要生产的对象(MacComputer,MiComputer)
MacComputer
与MiComputer
继承了Computer
类,SimpleComputerFactory
类可以根据不同的条件来生成相应品牌的电脑。
简单工厂模式的核心就是通过一个工厂方法根据不同的条件生产同一类型的产品。例如此例中我们要生产的小米笔记本和苹果笔记本他们是同一类型的产品,会实现同一个接口。
实例
王二狗的大学好基友骆驼毕业后进入了富士康担任管理工作,对就是那个一眼望去全是厂妹的地方。二狗很羡慕他,觉得这撩骚个厂妹儿多容易,一个月换一个,美滋滋...但是他们领导在其入职的第一条就告诫他:不准撩骚厂妹,否则结婚...,oh,shit!有一天他告诉二狗,最近不能出来和他喝酒了,公司接了苹果和小米的笔记本生产订单,会很忙...那我们如何用代码实现这个业务呢?
第一步:定义对象抽象基类
定义一个电脑的抽象基类,包含一个为电脑安装操作系统的抽象方法,这个就是产品要实现的共同接口。
public abstract class Computer {
public abstract void setOperationSystem();
}
第二步:定义具体的对象类
定义具体品牌的电脑类,苹果电脑和小米电脑。
public class MacComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("Mac笔记本安装Mac系统");
}
}
public class MiComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("小米笔记本安装Win10系统");
}
}
第三步:定义简单工厂方法类
使用一个静态工厂方法来根据不同的条件来产生不同的产品实例
public class SimpleComputerFactory {
public static Computer makeComputer(String brand) {
Computer computer=null;
switch (brand) {
case "mac":
computer=new MacComputer();
break;
case "mi":
computer=new MiComputer();
break;
default:
break;
}
return computer;
}
}
从上面的代码可见,这里其实还用到了里氏替换原则(Liskov Substitution Principle),返回的对象类型是声明类型的子类,也就是面向对象的多态特性。
在Java中,如果你有需求一般还可以结合反射,将这个工厂改的更加灵活和可配置。例如下面代码中那个类全限定名称就可以写在外部的xml或者yml等配置文件中。
public static Computer makeComputer(String objFullname) {
return 根据类路径(objFullname),通过反射构建对象;
}
第四步:客户端使用
public static void main(String[] args) {
Computer computer= SimpleComputerFactory.makeComputer("mi");
computer.setOperationSystem();
}
输出:
小米笔记本安装Win10系统
我们现在可以通过一个静态工厂方法,通过传入不同的参数类型来构建不同的对象实例了,我们将对象的构建过程完全交给了工厂方法类。
不使用设计模式
如果我们不使用设计模式能不能实现这个业务呢?答案当然是肯定的了。那就直接new对象咯,如下代码所示。好像不使用设计模式代码更简洁啊?这是因为此处的代码仅仅是为了演示而设计的异常简单的没有实用价值的代码,实际项目中对象之间的关系及构建过程比这个复杂的多,而且要不断的扩展和维护,这才是设计模式被引入软件系统设计的目的。
public static void main(String[] args) {
Computer miComputer=new MiComputer();
miComputer.setOperationSystem();
}
优缺点
优点
- 不直接在客户端创建具体产品的实例,降低了耦合性。
缺点
- 违反了开闭原则,(对扩展开放,对修改关闭),不容易形成高内聚松耦合结构。 每当我们增加一种产品的时候就要去修改工厂方法,这样会破坏其内聚性,给维护带来额外开支。为了克服简单工厂方法模式的缺点,工厂模式就被提了出来,我们下篇再来详细讨论。
总结
设计模式值得你刻意练习!
最后,如果你从本文中有所收获,可否点赞转发支持一下博主,你小小的鼓励,是激发博主持续写作的动力...
源码
一如既往,你可以从GitHub上得到本文的源码: design-patterns
文章评论