前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-工厂模式

设计模式-工厂模式

作者头像
用户9322266
发布2022-10-09 19:30:25
3500
发布2022-10-09 19:30:25
举报
文章被收录于专栏:MYMY

概念

创建对象的一种方式。

旧的实例化对象创建方式:new

转为:工厂方式,将选择实现类、创建对象统一管理和控制

作用

实现类的创建者和调用者的分离

  • 解耦,分离两个过程
  • 代码清晰
  • 工厂管理创建,使用者无需知道创建过程,只要使用,减少创建错误

类别

1. 简单工厂模式(静态工厂)

静态工厂:简单工厂中的方法变成静态

不需要创建实例直接调用

代码语言:txt
复制
- IProduct:抽象产品类,简单工厂模式所创建的所有对象的?类,描述所有实例所共有的公共接?。
- Product:具体产品类,是简单工厂模式的创建?标。
- Factory:工厂类,简单工厂模式的核心,它负责实现 创建所有实例的内部逻辑。

案例

  • IProduct接口: 创建抽象的车子Car接口,里面有一个name的接口方法:
代码语言:txt
复制
public interface Car {
代码语言:txt
复制
    void name() ;
代码语言:txt
复制
}
  • Product: 创建具体Car类-Tesla, Wuling
代码语言:txt
复制
public class Tesla implements Car {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void name() {
代码语言:txt
复制
        System.out.println("特斯拉Model3");
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class Wuling implements Car {
代码语言:txt
复制
@Override
代码语言:txt
复制
public void name() {
代码语言:txt
复制
    System.out.println("五菱之光");
代码语言:txt
复制
}
代码语言:txt
复制
}
  • Factory: 创建工厂类Factory
代码语言:txt
复制
public class CarFactory {
代码语言:txt
复制
    public static Car getCar(String name){
代码语言:txt
复制
        if ("五菱".equals(name)){
代码语言:txt
复制
            return new Wuling() ;
代码语言:txt
复制
        }else if("特斯拉".equals(name)){
代码语言:txt
复制
            return new Tesla() ;
代码语言:txt
复制
        }else{
代码语言:txt
复制
            return null ;
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}
  • 测试使用
代码语言:txt
复制
public class FactoryTest {    
代码语言:txt
复制
    public static void main(String[] args) {      
代码语言:txt
复制
        Car car = CarFactory.getCar(“Wuling”);  // 根据参数不同到工厂找创建对应的实例对象
代码语言:txt
复制
        car.name();  // 调用相关的方法
代码语言:txt
复制
}  

}

优点

  • 简单缺点
  • 不满足开闭原子(扩展开发,修改关闭)
  • 难以在原基础上实现扩展
  • 传参错误的话,工厂中不能创建实例

工厂方法模式

  • 对简单工厂进一步抽象,可以引进新的类,满足开闭原则
  • 更具扩展性和复用性,提高代码的可读性
代码语言:txt
复制
- IProduct:抽象产品接口,描述所有实例所共有的公共接?。
- Product:具体产品类,实现抽象产品类的接?,?? 类创建对象,如果有多个需要定义多个。
- IFactory:抽象??接口,描述具体??的公共接?。
- Factory:具体??类,实现创建产品类对象,实现抽 象??类的接?,如果有多个需要定义多个。

案例

  • IFactory:抽象工厂接口 创建抽象的车子Car接口,里面有一个name的接口方法:
代码语言:txt
复制
public interface CarFactory {
代码语言:txt
复制
    Car getCar() ;
代码语言:txt
复制
}
  • Factory:具体工厂类:
代码语言:txt
复制
  // Tesla工厂类
代码语言:txt
复制
public class TeslaFactory implements CarFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public  Car getCar( ){
代码语言:txt
复制
        if ("五菱".equals(name)){
代码语言:txt
复制
            return new Tesla() ;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
// Wuling工厂类
代码语言:txt
复制
public class WulingFactory implements CarFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Car getCar() {
代码语言:txt
复制
        return new Wuling();
代码语言:txt
复制
    }

}

  • IProduct:抽象产品接口 抽象的车子Car接口,里面有一个name的接口方法:
代码语言:txt
复制
public interface Car {
代码语言:txt
复制
    void name() ;
代码语言:txt
复制
}
  • Product:具体产品类 具体Car类-Tesla, Wuling
代码语言:txt
复制
public class Tesla implements Car {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void name() {
代码语言:txt
复制
        System.out.println("特斯拉Model3");
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class Wuling implements Car {
代码语言:txt
复制
@Override
代码语言:txt
复制
public void name() {
代码语言:txt
复制
    System.out.println("五菱之光");
代码语言:txt
复制
}
代码语言:txt
复制
}
  • 测试使用
代码语言:txt
复制
public class FactoryTest {    
代码语言:txt
复制
    public static void main(String[] args) {      
代码语言:txt
复制
        Car teslaCar =  TeslaFactory.getCar();  // 根据具体工厂类找创建实例对象
代码语言:txt
复制
        Car wulingCar =  WulingFactory.getCar();  // 根据具体工厂类找创建实例对象
代码语言:txt
复制
        teslaCar.name();  // 调用相关的方法
代码语言:txt
复制
        wulingCar.name();
代码语言:txt
复制
}  

}

image.png
image.png

优点

开闭原则:没增加一个产品类,只要实现对应的产品类和工厂类

单一职责原则:每个工厂值生产对应产品

缺点

每个增加的产品都要有对应的具体工厂和产品类

静态工厂模式

方法变成静态的,方便直接调用。

抽象工厂模式

整合简单工厂和工厂方法模式,Spring中用到。

实现步骤

代码语言:txt
复制
1. 定义两个接口:IPhoneProduct(手机)、IRouterPruduct(路由器)
2. 创建具体的 手机产品 和 路由器产品
3. 创建抽象工厂:IProductFactory ,其中有创建手机和创建路由器两个方法
4. 创建Apple产品族(Apple工厂),实现抽象工厂IProductFactory
5. 创建华为产品族(华为工厂),实现抽象工厂IProductFactory
6. 创建Client去拿到工厂,获取对应的产品

-

案例

  1. 两个产品接口:
代码语言:txt
复制
public interface IPhoneProduct {    //手机接口
代码语言:txt
复制
    void start() ;   //开机
代码语言:txt
复制
    void shutdown() ;  // 关机
代码语言:txt
复制
    void callUp() ; //打电话
代码语言:txt
复制
    void sendSMS() ;  //发短息
代码语言:txt
复制
}
代码语言:txt
复制
public interface IRouterProduct {    //路由器接口
代码语言:txt
复制
    void start() ;  // 路由器开机
代码语言:txt
复制
    void shutdown() ; //  路由器关机
代码语言:txt
复制
    void findWifi() ; // 路由器寻找wifi
代码语言:txt
复制
    void Setting() ; // 路由器设置
代码语言:txt
复制
}
  1. 具体的产品实现类,实现两个接口:
代码语言:txt
复制
/*
代码语言:txt
复制
*	Apple手机
*/
public class ApplePhone implements IPhoneProduct {
    @Override
    public void start() {System.out.println("Apple开机");}
    @Override
    public void shutdown() { System.out.println("Apple关机");}
    @Override
    public void callUp() {System.out.println("Apple打电话");}
    @Override
    public void sendSMS() {System.out.println("Apple发短信");}
}
/*
*	华为手机
*/
public class HuaWeiPhone implements IPhoneProduct {
    @Override
    public void start() { System.out.println("华为开机"); }
    @Override
    public void shutdown() { System.out.println("华为关机");}
    @Override
    public void callUp() { System.out.println("华为打电话");}
    @Override
    public void sendSMS() { System.out.println("华为发短信");}
}
代码语言:txt
复制
/*
代码语言:txt
复制
*	华为路由器
*/
public class HuaWeiRouter implements IRouterProduct {
    @Override
    public void start() {System.out.println("华为路由器开机");}
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void shutdown() {System.out.println("华为路由器关机"); }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void findWifi() { System.out.println("华为路由器找wifi");}
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void Setting() { System.out.println("开启华为路由器设置"); }
代码语言:txt
复制
}
代码语言:txt
复制
/*
代码语言:txt
复制
*	Apple路由器产品
*/
public class AppleRouter implements IRouterProduct {
    @Override
    public void start() {System.out.println("Apple路由器开机");}
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void shutdown() {System.out.println("Apple路由器关机"); }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void findWifi() {System.out.println("Apple路由器找wifi");}
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void Setting() {System.out.println("Apple华为路由器设置");}
代码语言:txt
复制
}
  1. 创建抽象工厂: IProductFactory生产相应的产品
代码语言:txt
复制
/***
代码语言:txt
复制
* 抽象工厂:生产工厂
*/
public interface IProductFactory {
代码语言:txt
复制
    //生产手机
代码语言:txt
复制
    IPhoneProduct iPhoneProduct() ;
代码语言:txt
复制
    //生产路由器
代码语言:txt
复制
    IRouterProduct iRouterProduct() ;
代码语言:txt
复制
}
  1. 创建Apple产品族(Apple工厂),实现抽象工厂IProductFactory
代码语言:txt
复制
public class AppleFactory implements IProductFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public IPhoneProduct iPhoneProduct() {
代码语言:txt
复制
        return new ApplePhone();
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public IRouterProduct iRouterProduct() {
代码语言:txt
复制
        return new AppleRouter();
代码语言:txt
复制
    }
代码语言:txt
复制
}
  1. 创建华为产品族(华为工厂),实现抽象工厂IProductFactory
代码语言:txt
复制
public class HuaWeiFactory implements IProductFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public IPhoneProduct iPhoneProduct() {
代码语言:txt
复制
        return new HuaWeiPhone();
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public IRouterProduct iRouterProduct() {
代码语言:txt
复制
        return new HuaWeiRouter();
代码语言:txt
复制
    }
代码语言:txt
复制
}
  1. 创建Client去拿到工厂,获取对应的产品
代码语言:txt
复制
public class Client {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        System.out.println("================华为生产====================");
代码语言:txt
复制
        HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
代码语言:txt
复制
        IPhoneProduct product = huaWeiFactory.iPhoneProduct();
代码语言:txt
复制
        product.start();
代码语言:txt
复制
        product.callUp();
代码语言:txt
复制
        product.sendSMS();
代码语言:txt
复制
        IRouterProduct routerProduct = huaWeiFactory.iRouterProduct();
代码语言:txt
复制
        routerProduct.findWifi();
代码语言:txt
复制
        routerProduct.Setting();
代码语言:txt
复制
        routerProduct.shutdown();
代码语言:txt
复制
        System.out.println("================Apple生产====================");
代码语言:txt
复制
        AppleFactory appleFactory = new AppleFactory();
代码语言:txt
复制
        IPhoneProduct iPhoneProduct = appleFactory.iPhoneProduct();
代码语言:txt
复制
        iPhoneProduct.start();
代码语言:txt
复制
        iPhoneProduct.callUp();
代码语言:txt
复制
        iPhoneProduct.sendSMS();
代码语言:txt
复制
        IRouterProduct iRouterProduct = appleFactory.iRouterProduct();
代码语言:txt
复制
        iRouterProduct.findWifi();
代码语言:txt
复制
        iRouterProduct.Setting();
代码语言:txt
复制
        iRouterProduct.shutdown();
代码语言:txt
复制
    }
代码语言:txt
复制
}
image.png
image.png

本文系转载,前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 作用
  • 类别
    • 1. 简单工厂模式(静态工厂)
      • 案例
      • 优点
    • 工厂方法模式
      • 案例
      • 优点
      • 缺点
    • 静态工厂模式
      • 抽象工厂模式
        • 实现步骤
        • 案例
    相关产品与服务
    短信
    腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com