简单工厂模式让用户在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。
1.先用人话讲一下什么是简单工厂模式
顾客只需要知道香蕉这个名字(仅仅是名字,不是真正的香蕉),水果农场(Factory)就能给出香蕉这个水果实体(能吃到嘴的香蕉,Product)。
简单工厂的定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类。
由于创建实例的方法通常都是静态的,因此简单工厂模式又被成为静态工厂方法模式,它是一种类创建型模式。
简单工厂模式的要点在于,当用户需要什么,只需要传入一个参数就可以得到对应的对象,不需要知道其中创建的细节。
2.简单工厂模式结构
1)简单工厂模式核心是工厂类的设计,包含三个角色。
==1)Factory(工厂角色):
^1. 主要负责创建所有产品实例的内部逻辑
^2. 可以被外界直接调用,创建所需的产品对象
^3. 提供静态的工厂方法factoryMethod(),返回类型为抽象产品类型Product
==2)抽象产品角色:
^1. 它是工厂类创建的所有对象的父类,封装了不同产品的共有方法
==3)具体产品角色:
^1. 它是最终的创建目标,每个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法
3.简单工厂模式的实现
1)抽象产品类
package controller.simpleFactoryModule;
/**
*抽象产品
*/
public abstract class Product {
//所有产品类的公共业务方法
public void methodSame(){
//公共方法的实现
}
//声明抽象业务方法
public abstract void methodDiff();
}
2)具体产品类A
package controller.simpleFactoryModule;
public class ConcreteProductA extends Product {
/**
* 实现业务方法
*/
@Override
public void methodDiff() {
//业务方法的实现
}
}
3)具体产品类B
package controller.simpleFactoryModule;
public class ConcreteProductB extends Product {
/**
* 实现业务方法
*/
@Override
public void methodDiff() {
//业务方法的实现
}
}
4)工厂类
package controller.simpleFactoryModule;
public class Factory {
//静态工厂方法
public static Product getProduct(String args){
Product product = null;
if(args.equals("A")){
product = new ConcreteProductA();
//初始化设置product
}else if(args.equals("B")){
product = new ConcreteProductB();
//初始化设置product
}
return product;
}
}
5)主类调用工厂类
package controller.simpleFactoryModule;
public class Client {
public static void main(String[] args) {
Product product;
product = Factory.getProduct("A");//通过工厂类创建产品对象
product.methodSame();
product.methodDiff();
}
}
4.创建对象的几种方法
1)使用new关键字直接创建
==1)方便,但是不好。它把对对象的创建和使用放在了一起。如果在需要添加方法就需要改源码
2)通过反射机制创建
3)通过克隆方法创建
4)通过工厂类创建
==1)相比new方法,A类和B类仅仅存在A创建B,或者A使用B,不会同时存在这两种关系
==2)防止用来实例化一个类的数据和代码在多个类中到处使用
==3)一个类可以有多个构造函数,满足不同的情况
5.简单工厂模式的简化
可以将抽象产品类和工厂类合并,将静态工厂方法移到抽象产品类中
6.简单工厂模式的优缺点
优:
1)实现对象创建和使用的分离
2)对于使用者更友好
3)引入配置文件,可以不用修改代码更新产品类
缺:
1)工厂类职责过重,一旦不能正常工作,整个系统都要受到影响
2)会增加类的数量,增加系统复杂度
3)一旦添加新产品,就需要修改工厂逻辑,不利于维护和拓展
4)因为使用静态工厂方法,导致无法形成基于继承的等级结构
7.简单工厂模式的试用环境
1)创建对象较少
2)客户端只知道传入工厂类的参数吗,不关心如何创建对象