工厂设计模式

工厂设计模式

简单工厂模式

/**
 * 简单工厂模式
 */
public class FactoryPattern {
    public static void main(String[] args) {
        //产品使用
        Application application = new Application();
        Product object = application.getObject("0");
        object.method();
    }
}
//抽象产品
interface Product{
    public void method();
}
//具体产品1
class ProductA implements Product{
    @Override
    public void method() {
        System.out.println("ProductA");
    }
}
//具体产品2
class ProductA1 implements  Product{
    @Override
    public void method() {
        System.out.println("ProductA1");
    }
}
//工厂类
class SimpleFactory{
    public static Product createProduct(String type){
        if (type.equals("0")){
            return new ProductA();
        }else if (type.equals("1")){
            return new ProductA1();
        }else {
            return null;
        }
    }
}
//调用具体工厂生产对应产品
class Application{
    private Product createProduct(String type){
        return SimpleFactory.createProduct(type);
    }
    Product getObject(String type){
        Product product = createProduct(type);
        return product;
    }
}

工厂方法模式

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使得一个类的实例化延迟到子类

应用场景

1.当你不知道该使用对象的确切类型的时候

2.当你希望为库或框架提供拓展其内部组件的方法时

优点

将具体产品和创建者解耦

符合单一指责原则

符合开闭原则

/**
 * 工厂方法模式
 */
public class FactoryMethod {
    public static void main(String[] args) {
        //产品使用
        Application1 concreteProductB = new ConcreteProductB1();
        Product1 object = concreteProductB.getObject();
        object.method();
    }
}
//抽象接口
interface Product1{
    public void method();
}
//产品b
class ProductB implements Product1 {
    @Override
    public void method() {
        System.out.println("ProductB");
    }
}
//产品B1
class ProductB1 implements Product1{
    @Override
    public void method() {
        System.out.println("ProductB1");
    }
}
//抽象方法
abstract class Application1{
    //工厂方法
    abstract Product1 createProduct();
    Product1 getObject(){
        Product1 product1 = createProduct();
        return product1;
    }
}
//把具体的实现交给子类
class ConcreteProductB extends Application1{
    @Override
    Product1 createProduct() {
        return new ProductB();
    }
}
class ConcreteProductB1 extends Application1{
    @Override
    Product1 createProduct() {
        return new ProductB1();
    }
}

抽象工厂模式

定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

应用场景

程序需要处理不同系列的相关产品,但是你不希望它依赖与这些产品的具体类时 可以使用抽象工厂模式

例如:

需求 一个程序需要提供对不同数据库的连接与命令分析

/**
 * 抽象设计模式
 */
public class AbstractFactoryTest {
    public static void main(String[] args){
        IDatabaseUtils IDatabaseUtils = new OracleDatabaseUtils();
        IConnection connection = IDatabaseUtils.getConnection();
        connection.connect();
        ICommand command = IDatabaseUtils.getCommand();
        command.command();
    }
}
//抽象连接方法
interface IConnection{
    void connect();
}
//抽象命令方法
interface ICommand{
    void command();
}
//抽象数据库工具接口
interface IDatabaseUtils{
    IConnection getConnection();
    ICommand getCommand();
}
//mysql连接对象
class MysqlConnection implements IConnection{

    @Override
    public void connect() {
        System.out.println("mysql连接");
    }
}
//Oracle连接对象
class OracleConnection implements IConnection{
    @Override
    public void connect() {
        System.out.println("Oracle连接");
    }
}
//mysql发生命令对象
class MysqlCommand implements ICommand{
    @Override
    public void command() {
        System.out.println("mysql发送命令");
    }
}
//oracle发生命令对象
class OracleCommand implements ICommand{
    @Override
    public void command() {
        System.out.println("Oracle发送命令");
    }
}
//mysql工具类
class MysqlDatabaseUtils implements IDatabaseUtils{
    @Override
    public IConnection getConnection() {
        return new MysqlConnection();
    }

    @Override
    public ICommand getCommand() {
        return new MysqlCommand();
    }
}
//oracle工具类
class OracleDatabaseUtils implements IDatabaseUtils{
    @Override
    public IConnection getConnection() {
        return new OracleConnection();
    }

    @Override
    public ICommand getCommand() {
        return new OracleCommand();
    }
}

在精简一下代码

//抽象连接方法
interface IConnection{
    void connect();
}
//抽象命令方法
interface ICommand{
    void command();
}
//抽象数据库工具接口
interface IDatabaseUtils{
    IConnection getConnection();
    ICommand getCommand();
}

实现这几个类就可以实现对应的功能

优点

可以确信你从工厂得到的产品是相互兼容的

可以避免具体产品和客户端代码之间的耦合

符合单一指责原则

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mybatis-plus增删改查以及前后端分离模式下的项目应用

    如果mybatis-plus自带的方法不能满足要求,可以在mapper中自定义方法

    许喜朝
  • 大数据:Hadoop-MapReduce练习

    第9、10、11、12字符为年份,第20、21、22、23字符代表温度,求每年的最高温度

    许喜朝
  • 初识Mybatis中的动态sql

    ​ 相当于sql中的where后面跟条件,需要注意的是where和if一样也是会把第一个条件执行的逻辑运算符去掉

    许喜朝
  • JavaEE基础(05):过滤器、监听器、拦截器,应用详解

    知了一笑
  • Android-实用的MVP

    code_horse
  • Spring中的Cache

    在其父类AdviceModeImportSelector的selectImports方法中,最终会回调子类的selectImports方法

    spilledyear
  • java线程池(二):聊聊newFixedThreadPool(1)和newSingleThreadExecutor()的区别

    在第一部分中介绍完java中Executors的线程池创建的方式之后,实际上有一个非常好奇的问题。既然newFixedThreadPool(1)也能保证...

    冬天里的懒猫
  • SurfaceView播放视频发送弹幕并实现滚动歌词

    本文实例为大家分享了SurfaceView播放视频发送弹幕,并实现滚动歌词,供大家参考,具体内容如下

    砸漏
  • Java匹马行天下之JavaSE核心技术——面向对象

    Java中可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

    泰斗贤若如
  • android UiAutomator基本api的二次封装

    本人在使用UiAutomator做测试的时候,封装了很多方法,由于之前的文章并没有分享这些封装方法,导致阅读不畅。本来打算再把图像识别和辅助类写完在分享,鉴于已...

    FunTester

扫码关注云+社区

领取腾讯云代金券