简单工厂模式(Smiple Factory Pattern):定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,简单工厂模式也被称为静态工厂模式。
~
本篇内容包括:工厂模式 概述、关于 简单工厂模式、简单工厂模式 Demo。
工厂方法是一种十分常用的创建型设计模式,它在父类中提供了创建对象的接口但允许子类更改将要创建的对象的类型。
在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式,在任何需要生成复杂对象的地方,都可以使用工厂模式。
一般情况下,我们所提及的“工厂模式”会被细分为三种,即简单工厂、工厂方法和抽象工厂。而 GoF 的《设计模式》一书中,它将简单工厂模式看作是工厂方法模式的一种特例,所以工厂模式只被分成了工厂方法和抽象工厂两类。
简单工厂模式(Smiple Factory Pattern):定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,简单工厂模式也被称为静态工厂模式。
简单工厂模式将产品的“消费”和“生产”完全分开,调用房,只需要自己需要什么产品,和如何使用就可以了,而对于产品的具体生产任务,则由工厂类来实现。
工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。
简单工厂的构成:
factoryMethod()
,它返回的产品类型为抽象的产品类型 Product。首先,根据具体产品进行抽象,将它们的公共的代码进行抽象和提取后,封装在一个抽象产品中;
其次,根据抽象产品,将各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品都是抽象产品的子类;
然后,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据传入的参数不同创建不同的具体产品对象;
最后,客户端只需要调用工厂类的工厂方法并传入响应的参数即可得到一个具体产品对象。
优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。
缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则
# 角色
DemoFactory、DemoAbstractProduct、DemoProductA、DemoProductB
# 实现
DemoAbstractProduct 是作为产品角色的抽象父类,DemoProductA、DemoProductB 是作为产品角色的具体实现的子类。
DemoFactory 作为具体工厂角色,通过方法 factoryMethod(String productName)
根据 productName 返回对应的工厂。
# DemoAbstractProduct 抽象产品类
//抽象产品类
public abstract class DemoAbstractProduct {
//抽象产品方法
public abstract sayHi();
}
# DemoProductA 具体产品类A
//继承抽象类实现产品A类
public class DemoProductA extends DemoAbstractProduct {
//实现抽象产品方法
@Overide
public abstract sayHi(){
System.out.println("Hi, I'm ProductA");
}
}
# DemoProductB 具体产品类B
//继承抽象类实现产品B类
public class DemoProductB extends DemoAbstractProduct {
//实现抽象产品方法
@Overide
public abstract sayHi(){
System.out.println("Hi, I'm ProductB");
}
}
# DemoFactory 产品工厂类
public class DemoFactory {
public DemoFactory() {}
//第一种写法
//根据产品名称生产产品
public DemoAbstractProduct factoryMethod(String productName) {
DemoAbstractProduct product = NULL;
switch(productName){
case "A":
product = new DemoProductA();//生产产品A
break;
case "B":
product = new DemoProductB();//生产产品B
break;
default:
break;
}
return product;
}
}
public class Client {
public static void main(String[] args) {
DemoAbstractProduct product;
//通过工厂类创建具体产品对象
product = DemoFactory.factoryMethod("A");
product.sayHi();
}
}