工厂设计模式

本文深入探讨了工厂模式在软件设计中的应用,包括工厂方法模式和抽象工厂模式,详细讲解了各自的定义、使用场景及代码实现,帮助读者理解如何在实际开发中有效运用工厂模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         在我们的开发过程中,工厂模式是应用最广泛的设计模式之一,当然也是最容易理解的设计模式之一;而对于工厂设计模式而言,它有以下的几个表现形式

 

工厂方法模式

 

定义:创建一个用于创建对象的接口,让子类决定实例化哪个类

使用场景:在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

简单事例:

/**
 * 抽象产品类
 */
public abstract class Product {

    // 产品类的抽象方法,由具体的产品类去实现
    public abstract void method();

}
/**
 * 具体的产品类A
 */
public class ConcreteProductA extends Product {
    @Override
    public void method() {
        Log.e("aaaa","这是具体的产品A");
    }
}
/**
 * 具体的产品类B
 */
public class ConcreteProductB extends Product {
    @Override
    public void method() {
        Log.e("aaaa","这是具体的产品B");
    }
}
/**
 * 抽象的工厂类
 */
public abstract class Factory {
    
    // 具体的产品对象
    public abstract Product createProduct();

}
/**
 * 具体的工厂类
 */
public class ConcreteFactory extends Factory {
    
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

总结一下:

工厂方法模式很简单,就是在具体的工厂里面去实例化自己需要的那个实例。

当然,在实际的开发过程中,我们可以通过反射去获取自己想要的那个实例,我们只需要稍微修改一下抽象工厂即可

/**
 * 抽象的工厂类
 */
public abstract class Factory {

    // 具体的产品对象
    public abstract <T extends Product> T createProduct(Class<T> clazz);

}
/**
 * 具体的工厂类
 */
public class ConcreteFactory extends Factory {

    @Override
    public <T extends Product> T createProduct(Class<T> clazz) {
        Product p = null;
        try {
            p = (Product) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) p;
    }
}

那么我们在这里考虑一个问题,如果我们的工厂只有一个的时候,我们可不可以去掉抽象工厂,答案肯定是可以的,这个时候我们可以这么写:

public class ConcreteFactory {

    public static Product createProduct() {
        return new ConcreteProductA();
    }
}

这种方式我们称之为简单工厂模式,它是工厂方法的一个弱化版本。

 

抽象工厂模式

 

定义:为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类

标准例子如下:

/**
 * 抽象产品类A
 */

public abstract class AbstractProductA {

    public abstract void method();

}
/**
 * 抽象产品类B
 */

public abstract class AbstractProductB {

    public abstract void method();

}
/**
 * 具体产品类A1
 */

public class ConcreteProductA1 extends AbstractProductA {
    @Override
    public void method() {
         System.out.print(" 具体产品 A1 的方法");
    }
}
/**
 * 具体产品类A2
 */

public class ConcreteProductA2 extends AbstractProductA {
    @Override
    public void method() {
        System.out.print(" 具体产品 A2 的方法");
    }
}
/**
 * 具体产品类B1
 */

public class ConcreteProductB1 extends AbstractProductB {
    @Override
    public void method() {
        System.out.print(" 具体产品 B1 的方法");
    }
}
/**
 * 具体产品类B2
 */

public class ConcreteProductB2 extends AbstractProductB {
    @Override
    public void method() {
        System.out.print(" 具体产品 B2 的方法");
    }
}
/**
 * 抽象工厂类
 */

public abstract class AbstractFactory {

    public abstract AbstractProductA createProductA();

    public abstract AbstractProductB createProductB();

}
/**
 * 具体工厂类1
 */

public class ConcreteFactory1 extends AbstractFactory{

    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}
/**
 * 具体工厂类2
 */

public class ConcreteFactory2 extends AbstractFactory {

    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

虽然抽象工厂方法模式的类繁多,但是,主要还是4类:

AbstractFactory:抽象工厂角色,它声明了一组用于创建一种产品的方法,每一种方法对应一种产品

ConcreteFactory:具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生成一种具体的产品

AbstractProduct:抽象产品角色,它为每种产品声明接口

ConcreteProduct:具体产品角色,它定义具体工厂生产的具体产品对象

 

抽象工厂方法模式在Android开发中使用的并不多,在源码当中看到的也比较少,主要是在开发过程中很少会出现多个产品种类的情况,大部分情况我们使用工厂模式即可解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值