设计模式系列文章目录
如果本文对你们的开发之路有所帮助,请帮忙点个赞,您的支持是我坚持写博客的动力
前言
上一篇文章带着大家初探设计模式,本文将讲解设计模式的工厂模式
什么是工厂方法/说说工厂方法定义
- 工厂模式是一种创建型设计模式
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类,让一个类的实例化延迟到子类
- 把对象的创建和使用的过程分开
可以画出工厂模式吗,并简单说明下
类图
说明
- 抽象类
Product
负责定义类的共性,实现对实现类ConceteProduct
对抽象的定义 - 抽象工厂
Factory
负责定义实现工厂的共性,具体创建实现类由 实现工厂ConcreteFactory
实现
说说工厂模式的好处
- 工厂模式可以实现
代码解耦
,将对象的创建和实现的过程分开。 - 工厂模式使得代码具有
可扩展性
,定义好抽象工厂以及抽象类,扩展相对应的实现类即可。 - 工厂模式使得代码
易于维护
,把对象创建的具体逻辑给隐藏起来了,交给工厂统一管理。实现类不需要知道具体地创建过程。
工厂模式有什么分类呢?
工厂模式主要分为三类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
下面将一一讲解这三种工厂模式
介绍下简单工厂吧
###概念
- 实现类不需要关注对象的创建过程
优点:
- 创建对象简单,通过名称即可创建对象
缺点
- 违背开闭原则,每添加一个对象都需要修改工厂类
总结
简单工厂模式实现简单,但违背开闭原则,扩展性强
能不能用代码实现简单工厂
实现代码背景:实现联合支付功能,使得接入第三方支付简易
代码详见:https://gitee.com/janyxe/design_patterns
定义支付工厂,通过传不同的类型,实现不同的逻辑
class PayFactory{
public static PayService toPay(String type){
if ("ali".equals( type )){
return new AliPayService();
}
if ("wechat".equals( type )){
return new WeChatPayService();
}
return null;
}
}
定义公共方法
public interface PayService {
void pay();
}
通过实现公共方法,走不同的实现逻辑
public class AliPayService implements PayService {
@Override
public void pay() {
System.out.println("使用支付宝支付...");
}
}
public class WeChatPayService implements PayService {
@Override
public void pay() {
System.out.println("使用微信支付");
}
}
public class SimpleApp {
public static void main(String[] args) {
PayService payService = PayFactory.toPay("wechat");
payService.pay();
}
}
控制台输出:
使用微信支付
简单介绍工厂方法
概念
- 创建对象工作委托给具体工厂
- 实现类不需要知道所需对象的类,只需要对应实现工厂类即可
优点
- 屏蔽对象创建具体实现,调用者只需要实现接口即可
缺点
- 增加了系统复杂度,每添加一个类都需要增加对应的工厂类
能不能用代码实现工厂方法
实现代码背景:通过不同的产品工厂实现不同产品的生产
代码详见:https://gitee.com/janyxe/design_patterns
定义产品生产公共接口
public interface Product {
/**
* 生产商品
*/
void create();
}
不同产品实现
/**
* 饮料类产品生产
*/
public class DrinksProduct implements Product {
@Override
public void create() {
System.out.println("饮料类产品生产");
}
}
/**
* 食品类产品生产
*/
public class FoodProduct implements Product {
@Override
public void create() {
System.out.println("食品类产品生产");
}
}
定义产品工厂 生产公共方法
/**
* 产品工厂创建产品
*/
public interface ProductFactory {
void createProduct();
}
实现产品工厂,实现生产不同的产品
/**
* 饮料类产品生产
*/
public class DrinksProduct implements Product {
@Override
public void create() {
System.out.println("饮料类产品生产");
}
}
/**
* 食品类产品生产
*/
public class FoodProduct implements Product {
@Override
public void create() {
System.out.println("食品类产品生产");
}
}
调用工厂类 生产产品
public class MethodApp {
public static void main(String[] args) {
DrinksProductFactory drinksFactory = new DrinksProductFactory();
drinksFactory.createProduct();
FoodProductFactory foodFactory = new FoodProductFactory();
foodFactory.createProduct();
}
}
控制台输出
饮料类产品生产
食品类产品生产
概述下抽象工厂模式以及优缺点
概念
- 需要一组对象完成某种功能或多组对象完成不同的功能
优点
扩展性高
,可通过一组对象实现某个功能
缺点
- 不符合
开闭原则
,增加功能就需要修改原有代码
开闭原则:一个实体是允许在不改变它的源代码的前提下变更它的行为
能不能用代码实现工厂方法
实现代码背景:通过不同的产品工厂实现不同产品的生产
代码详见:https://gitee.com/janyxe/design_patterns
定义产品生产公共接口
public interface Product {
/**
* 生产商品
*/
void create();
}
不同产品实现
/**
* 饮料类产品生产
*/
public class DrinksProduct implements Product {
@Override
public void create() {
System.out.println("饮料类产品生产");
}
}
/**
* 食品类产品生产
*/
public class FoodProduct implements Product {
@Override
public void create() {
System.out.println("食品类产品生产");
}
}
定义抽象产品创建方法
public abstract class AbstractProduct {
/**
* 抽象产品创建方法
*/
public abstract Product create();
public void creatProduct(){
Product product = create();
product.create();
}
}
不同的产品实现抽象方法
/**
* 生产饮料实现类
*/
public class ConcreteDrinksProduct extends AbstractProduct {
@Override
public Product create() {
return new DrinksProduct();
}
}
public class ConcreteFoodProduct extends AbstractProduct {
@Override
public Product create() {
return new FoodProduct();
}
}
生产产品,调用代码
public class AbstractApp {
public static void main(String[] args) {
// 生产饮料
AbstractProduct drinksProduct = new ConcreteDrinksProduct();
drinksProduct.creatProduct();
// 生产食品
AbstractProduct foodProduct = new ConcreteFoodProduct();
foodProduct.creatProduct();
}
}
控制台输出
饮料类产品生产
食品类产品生产