前言
前面大致懂了使用UML去表示模型
设计模式七大原则则是设计模式的总体思想
接下来看看具体的设计模式
目录
- 设计模式
- 创建型模式
- 简单工厂模式
3.1. 模式定义
3.2. 模式结构
3.3. 模式实例 - 简单工厂模式的优缺点
- 简单工厂模式适用场景
- 模式简化
- 总结
设计模式
设计模式有23种
可以通过不同的分法分类
最常见的是根据目的分类:
创建型模式(五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式(七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式(十一种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
简单工厂模式属于创建型模式,但不属于23种设计模式,可以看做特殊的工厂方法模式
创建型模式
创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则
意思就是:对象的创建由相关的工厂来完成,用户只需要使用就可以了
简单工厂模式
模式定义
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
模式结构
-
Factory(工厂):核心部分,负责实现创建所有产品的内部逻辑,工厂类可以被外界直接调用,创建所需对象
-
Product(抽象类产品):工厂类所创建的所有对象的父类,封装了产品对象的公共方法,所有的具体产品为其子类对象
-
ConcreteProduct(具体产品):简单工厂模式的创建目标,所有被创建的对象都是某个具体类的实例。它要实现抽象产品中声明的抽象方法(有关抽象类)
模式实例
不需要知道产品类的名字,只需要知道表示产品的一个参数,把参数传入方法就可以获得对象
汽车工厂:
package com.company.DesignPatterns;
abstract class CarFactory {
String carType;
abstract void produce();
}
class BMW extends CarFactory{
@Override
void produce() {
System.out.println("生产宝马中:"+carType+"生产成功");
}
}
class AE extends CarFactory{
@Override
void produce() {
System.out.println("生产AE86:"+carType+"生产成功");
}
}
class Productor{
public static void main(String [] args){
BMW bmw=new BMW();
bmw.carType="宝马";
bmw.produce();
AE ae=new AE();
ae.carType="AE86";
ae.produce();
}
}
在工厂类中,每创建一种汽车都需要new一个对象,实例化类会造成耦合性高
使用简单工厂模式:
package com.company.DesignPatterns;
abstract class CarFactory {
String carType;
abstract void produce();
}
//生产BMW
class BMW extends CarFactory{
public BMW( String carType) {
this.carType=carType;
}
@Override
void produce() {
System.out.println("生产宝马中:"+carType+"生产成功");
}
}
//生产AE
class AE extends CarFactory{
public AE( String carType) {
this.carType=carType;
}
@Override
void produce() {
System.out.println("生产AE86:"+carType+"生产成功");
}
}
//简单工厂
class FactoryProCar{
public static CarFactory producetCar(String carType){
switch (carType){
case "BMW":
return new BMW("BMW");
case "AE86":
return new AE("AE86");
}
return null;
}
}
//用户需要的创建类
class Productor{
public static void main(String [] args){
FactoryProCar.producetCar("AE86").produce();
}
}
即现在只需要将Productor类给用户使用,用户传递什么参数就可以创建什么对象
简单工厂模式的优缺点
优点:
- 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量
- 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性
缺点:
- 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响
- 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构
简单工厂模式适用场景
前面优缺点说的很明白,简单工厂模式让责任分割
适用于:客户端只知道传入工厂类的参数,对于如何创建对象不关心的场景
会提高系统复杂度
适用于:工厂类负责创建的对象比较少的场景:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
应用
其实在JDK类库中广泛使用了简单工厂模式
工具类java.text.DateFormat,它用于格式化一个本地日期或者时间
这种方法都是简单工厂模式
Java:DES加密方法
模式简化
产生那些子类、工厂类太麻烦了,有些情况下可以将抽象类当做工厂类使用
abstract class CarFactory {
String carType;
CarFactory(String carType) {
this.carType = carType;
}
abstract void produce();
public static CarFactory producetCar(String carType){
switch (carType){
case "BMW":
return new CarFactory("BMW") {
@Override
void produce() {
System.out.println("生产宝马中:"+carType+"生产成功");
}
};
case "AE86":
return new CarFactory("AE86") {
@Override
void produce() {
System.out.println("生产AE86:"+carType+"生产成功");
}
};
}
return null;
}
}
class Productor{
public static void main(String [] args) {
CarFactory.producetCar("AE86").produce();
}
}
总结
- 23种设计模式根据目的可分为三类:创建型模式、结构型模式、行为型模式
- 创建型模式:将对象的创建与使用分割开
- 简单工厂模式不是23种设计模式之一,属于创建型模式,可以看做一种特殊的工厂方法模式
- 简单工厂模式通常定义一个类来专门负责创建对象,可以根据不同的参数返回不同的实例