设计模式之工厂模式

工厂模式属于创建型模式,作用就是创建对象。我们最熟悉也是最简单的方式就是new一个对象,然后set相关属性,但是这种方式耦合性太强,对于后期业务快速发展及代码的维护十分不友好,因此我们需要给客户端提供更加友好的创建对象的方式。

简单工厂模式

public class FoodFactory {

    public static Food makeFood(String name) {
        if (name.equals("noodle")) {
            Food noodle = new LanZhouNoodle();
            noodle.addSpicy("more");
            return noodle;
        } else if (name.equals("chicken")) {
            Food chicken = new HuangMenChicken();
            chicken.addCondiment("potato");
            return chicken;
        } else {
            return null;
        }
    }
}

简单工厂模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层简单的封装。一个工厂类XxxFactory,里面有一个静态方法,根据不同的参数,返回不同的派生来自同一个父类(或者同一接口)的实例对象。

工厂方法模式

简单工厂模式很简单,之所以要进入工厂模式,是因为我们往往需要使用两个或两个以上的工厂。工厂方法模式将生成具体食物的任务分发给具体的食物工厂。

public interface FoodFactory {
    Food makeFood(String name);
}
public class ChineseFoodFactory implements FoodFactory {

    @Override
    public Food makeFood(String name) {
        if (name.equals("A")) {
            return new ChineseFoodA();
        } else if (name.equals("B")) {
            return new ChineseFoodB();
        } else {
            return null;
        }
    }
}
public class AmericanFoodFactory implements FoodFactory {

    @Override
    public Food makeFood(String name) {
        if (name.equals("A")) {
            return new AmericanFoodA();
        } else if (name.equals("B")) {
            return new AmericanFoodB();
        } else {
            return null;
        }
    }
}

client端调用

public class client {
    public static void main(String[] args) {
        // 先选择一个具体的工厂
        FoodFactory factory = new ChineseFoodFactory();
        // 由第一步的工厂产生具体的对象,不同的工厂造出不一样的对象
        Food food = factory.makeFood("A");
    }
}

抽象工厂模式

抽象工厂其实就是多个工厂方法模式。在有多个业务品种,业务分类时,通过抽象工厂模式生产需要的对象是一种非常好的解决方式。下面是抽象工厂模式的通用代码示意:
在这里插入图片描述

  1. AbstracFactory类

下面的代码是一个抽象工厂类,它的职责是定义每个工厂要实现的功能,有n个产品族,在抽象工厂类中就应该有n个创建方法。

public abstract class AbstractFactory {
 
     //创建A产品家族
     public abstract AbstractProductA createProductA();
     //创建B产品家族
     public abstract AbstractProductB createProductB();
     
}
  1. AbstractProduct类

抽象产品类,两个抽象产品类可以有关系,例如共同继承或实现一个抽象类或接口。

public abstract class AbstractProductA {

    //每个产品共有的方法
    public void shareMethod() {}
    //每个产品相同方法,不同实现
    public abstract void doSomething();

}
  1. ConcreteFactory类

具体工厂实现类,如何创建一个产品是由具体的实现类来完成的。

public class ConcreteFactory1 extends AbstractFactory {

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

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

}
  1. ConcreteProduct类
public class ProductA1 extends AbstractProductA {

    @Override
    public void doSomething() {
        System.out.println("产品A1实现方法");
    }

}
public class ProductA2 extends AbstractProductA {

     @Override
     public void doSomething() {
         System.out.println("产品A2实现方法");
     }

 }
  1. client端调用

在客户端中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只需要知道它的工厂方法就可以直接生产一个产品对象,没必要关心它的实现类。

public class Client {

    public static void main(String[] args) {
        //定义两个工厂
        AbstractFactory factory1 = new ConcreteFactory1();
        AbstractFactory factory2 = new ConcreteFactory2();

        //产生A1对象
        AbstractProductA a1 = new ProductA1();
        //产生A2对象
        AbstractProductA a2 = new ProductA2();
        //产生B1对象
        AbstractProductB b1 = new ProductB1();
        //产生B2对象
        AbstractProductB b2 = new ProductB2();

        //....
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工厂模式是一种常见的创建型设计模式,用于创建对象,而不是通过直接调用构造函数来创建它们。工厂模式定义了一个接口,用于创建相关对象,但是让子类决定要实例化的类。在C++中,工厂模式可以通过以下步骤实现: 1. 创建一个抽象基类,该类定义了一个纯虚拟函数,该函数将返回一个指向基类的指针。这个基类就是我们的工厂接口。 ```c++ class Product { public: virtual ~Product() {} virtual void operation() = 0; }; ``` 2. 创建具体的产品类,它们继承自抽象基类,并实现了其纯虚拟函数。这些类就是我们的具体产品。 ```c++ class ConcreteProductA : public Product { public: void operation() override { /* 具体产品 A 的操作 */ } }; class ConcreteProductB : public Product { public: void operation() override { /* 具体产品 B 的操作 */ } }; ``` 3. 创建一个工厂类,该类实现了工厂接口,并根据需要创建具体的产品。这个工厂类就是我们的具体工厂。 ```c++ class Factory { public: virtual ~Factory() {} virtual std::unique_ptr<Product> createProduct() = 0; }; class ConcreteFactoryA : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductA>(); } }; class ConcreteFactoryB : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductB>(); } }; ``` 4. 在客户端代码中使用具体工厂创建具体产品。 ```c++ int main() { std::unique_ptr<Factory> factory = std::make_unique<ConcreteFactoryA>(); std::unique_ptr<Product> product = factory->createProduct(); product->operation(); return 0; } ``` 这就是工厂模式的基本实现方式。通过这种方式,我们可以将对象的创建过程与客户端代码分离,从而更好地实现模块化和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值