概述
-
创建型模式关注对象的创建过程
-
创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节
-
创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展
简单工厂模式基本实现流程
-
具体产品类:将需要创建的各种产品对象的相关代码封装到具体产品类中
-
抽象产品类:将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中
-
工厂类:提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象
-
客户端:只需要工厂类的工厂方法并传入相应的参数即可的到一个产品对象
建工厂模式定义:
-
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类
-
在简单工厂模式中用于创建实例的方法通常时静态(static)方法,因此又被称为静态工厂方法(Static Factory Method)模式
-
要点:如果需要什么,就只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其创建细
简单工厂模式的结构
-
Factory(工厂角色)
-
Product(抽象产品角色)
-
ConcreteProduct(具体产品角色)
简单工厂模式的实现
-
抽象产品类代码
public abstract class Product { //**所有产品类的公共业务方法 public void methodSame() { //**公共方法的实现** } //**声明抽象业务方法** public abstract void methodDiff(); } -
具体产品类代码
public class ConcreteProduct extends Product{ //实现业务方法 public void methodDiff() { //业务方法的实现 } } -
工厂代码
public class Factory { //静态工厂方法 public static Product getProduct(String arg) { Product product = null; if (arg.equalsIgnoreCase("A")) { product = new ConcreteProductA(); //初始化设置product } else if (arg.equalsIgnoreCase("B")) { product = new ConcreteProductB(); //初始化设置product } return product; } } -
客户端代码
public class Client { public static void main(String args[]) { Product product; product = Factory.getProduct("A"); //通过工厂类创建产品对象 product.methodSame(); product.methodDiff(); } }
Java语言创建对象的几种方式
-
使用new关键字直接创建对象
-
通过反射机制创建对象
-
通过克隆方法创建对象
-
通过工厂类创建对象
将对象的创建与使用分离的其他好处
-
防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类中,解决代码重复、创建蔓延的问题
-
构造函数的名字都与类名相同,从构造函数和参数列表中大家很难了解不同构造函数所构造的产品的差异将对象的创建过程封装在工厂类中,可以提供一系列名字完全不同的工厂方法,每一个工厂方法对应一个构造函数,客户端可以以一种更加可读、易懂的方式来创建对象
模式优点
-
实现了对象创建和使用的分离
-
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
-
通过引入配置文件,可以在不修改任何客户端代码的情况下更滑和增加新的具体产品类,在一定程度上提高了系统的灵活性
模式缺点
-
工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
-
增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度
-
系统扩展困难,一旦添加新产品不得不修改工厂逻辑
-
由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好的扩展
适用环境
-
工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
-
客户端只知道传入工厂类的参数,对于如何创建对象并不关心



