本文首发于顶格博客 https://www.dgjava.com/archives/pattern-factory-1 转账请注明出处,更多文章请访问 顶格博客
工厂模式的诞生,源于创建对象的复杂性。在实际生产开发的过程中,我们通过
new
关键字来创建对象存在很多局限性,因为一个往往一个对象的创建包括多个步骤甚至多个嵌套的子对象。
前言
一开始,智能手机只需要满足基本的打电话、上网、发短信,拍照等基础功能即可。以华为为例,(假设)一开始只有华为一个品牌,那只有一个工厂生产华为手机。后来为了扩大影响力占据更多市场份额,华为衍生出了mate、荣耀、Nova等品牌,但还是原来的工厂生产这些不同品牌的手机,这个时候,这个工厂就形成了一个 简单工厂模式
。
后来随着软硬件技术的提升,这些基本功能都能很好的满足了,手机厂商为了提高产品的竞争力,势必要让手机具备更多更完善的功能。于是华为在处理器和摄像头上下功夫,自研处理器和强大的拍照技术,迅速让华为系列的手机有着很好的口碑。这个时候,一个工厂不够用了,就需要不同的工厂生产不同品牌的手机,于是就形成了 工厂方法模式
。
任何一个产品,都需要不断的推陈出新才能维持好的口碑以及用户群体。用户也需要通过不断升级换代,来获取更好的产品。于是不管是华为还是荣耀,都要让产品形成一个系列,持续的占据市场份额。这个时候,原来的工厂生产的是一个品牌不同系列的手机,于是,都是华为旗下的手机工厂,生产的是不同品牌不同系列的手机,就形成了 抽象工厂模式
。
至此,完成了共产模式的不同阶段的解释。下面我们通过代码来更为具体的描述什么叫 工厂模式
。
代码实现
简单工厂模式
定义手机父类对象
import lombok.Data;
/**
* @Author: dgjava.com
* @Date: 2020/5/1 5:41 PM
* 顶层手机对象 phone
*/
@Data
public class Phone {
protected String brand;
}
定义华为品牌手机
/**
* @Author: dgjava.com
* @Date: 2020/5/1 5:40 PM
*/
public class HuaWei extends Phone{
public HuaWei(){
this.brand="华为";
}
}
定义荣耀品牌手机
/**
* @Author: dgjava.com
* @Date: 2020/5/1 5:40 PM
*/
public class RongYao extends Phone {
public RongYao() {
this.brand = "荣耀";
}
}
定义手机工厂
/**
* @Author: dgjava.com
* @Date: 2020/5/1 5:41 PM
*/
public class PhoneFactory {
public Phone createPhone(String brand) {
switch (brand) {
case "huawei":
return new HuaWei();
case "rongyao":
return new RongYao();
default:
return new Phone();
}
}
}
测试代码
/**
* @Author: dgjava.com
* @Date: 2020/5/1 5:45 PM
*/
public class FactoryDeom {
public static void main(String[] args) {
PhoneFactory factory = new PhoneFactory();
Phone phone = factory.createPhone("huawei");
System.out.println(phone.getBrand());//华为
}
}
定义
对于简单工厂模式而言,一个工厂类处于对产品实例化的中心位置。他知道每一个产品,并且决定哪一个产品类应该被实例化,如上述代码中的华为或荣耀。
- 优点:允许客户端相对独立的创建产品,并且在系统引入新产品的过程中无须修改客户端,在一定程度上支持开闭原则。
- 缺点:对开闭原则的支持力度不够,因为引入新产品虽然不用修改产品类,但是需要修改工厂类来支持新产品。