设计模式之工厂模式

  以前看过很多关于工厂模式的例子,当然能够看懂代码,但是为什么这样设计,这样设计的好处却不知道。最近在学习Spring的时候慢慢意识到Spring这个框架就是设计模式的一个大集合(现在理解的可能不对,当然肯定还不深入),理解好设计模式框架相对就容易学的多了。

  在Effective Java这本书中,书一开始就在讲对象的创建。工厂是什么呢?工厂是生产东西的地方,在java中东西就是对象,工厂就是生产对象的地方。所以说对象不是new出来的,而是工厂生产出来的(当然在工厂的内部还是需要new,只是不在我们的一般类中进行new)。这样的好处就是,当需要的类型变化时候你不需要修改当前类中的代码(可能有很多需要new这个对象的地方),只要修改工厂的生产过程就好了。这样能够降低程序的耦合性,当需求变化一点时候,代码不需要大量的修改,各个模块之间相对独立。

  我们进入正题,工厂模式有两种:一般的工厂模式和抽象的工厂模式。

 

  1、先看一般的工厂模式:一个人乘坐某种交通工具出行。看我们的类图:

每一个交通工具对应着一个工厂,想要乘坐某种交通工具出行,那么只能采用继承。这里有一个缺点,就是每个工厂只能生产一种交通工具,抽象工厂模式解决看了这个问题。

  我们可以看一段简单的代码:

  看Vehicle代码:

package com.worsun.尚学堂工厂模式;
public interface Moveable {
	void run();
}

   看Car的代码:

package com.worsun.尚学堂工厂模式;
public class Car implements Moveable{
	private static Car car = new Car();
	public Car(){}
	public static Car getInstance(){
		return car;
	}
	public void run(){
		System.out.println("车冒着烟去东北!");
	}
}

 Plane和Broom代码类似于Car的代码。

  再看抽象工厂类的代码:

package com.worsun.尚学堂工厂模式;
public abstract class VehicleFactory {
	public abstract Moveable create();
}

   看Car的工厂类CarFactory的代码:

package com.worsun.尚学堂工厂模式;
public class CarFactory extends VehicleFactory{
	public Moveable create(){
		return new Car();
	}
}

   最后看一下调用者的代码:

  

package com.worsun.尚学堂工厂模式;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//Car car = new Car();
		VehicleFactory factory = new BroomFactory();
		Moveable m = factory.create();
		m.run();
	}

}

 以上就是一般的工厂模式,理解起来还是不费劲的,但记住两个字:继承

特点:每一个产品对应一个工厂,每一个工厂对应一个产品,也就是一一对应的关系。

2、我们再来看看抽象工厂模式。与一般的共产模式很是类似,但是区别的是一个工厂可以生产很多产品。这里要记住两个字:组合

  先来看看类图关系:

 

public class Client {

    public static void main(String[] args) {
        CarFactory factory = new LuxuryCarFactory();
        Engine engine = factory.createEngine();
        engine.run();
        engine.start();
    }

}

interface Engine {
    void start();
    void run();
}

interface Seat{
    void seat();
}

interface Tyre{
    void revolve();
}





class LuxuryEngine implements Engine{

    @Override
    public void start() {
        System.out.println("高端发动机启动快!");
    }

    @Override
    public void run() {
        System.out.println("高端发动机跑的快!");
    }
    
}

class LowerEngine implements Engine{
    @Override
    public void start() {
        System.out.println("低端发动机启动慢!");
    }

    @Override
    public void run() {
        System.out.println("低端发动机跑的慢!");
    }
}

class LuxurySeat implements Seat{

    @Override
    public void seat() {
        System.out.println("高端座椅坐着舒服!");
    }
    
}

class LowerSeat implements Seat{

    @Override
    public void seat() {
        System.out.println("低端座椅坐着难受!");
    }
}

class LuxuryTyre implements Tyre{

    @Override
    public void revolve() {
        System.out.println("高端轮胎不磨损~!");
    }
    
}

class LowerTyre implements Tyre{

    @Override
    public void revolve() {
        System.out.println("低端轮胎磨损快!");
    }
    
}


interface CarFactory{
    public Engine createEngine();
    public Seat createSeat();
    public Tyre createTyre();
}

class LuxuryCarFactory implements CarFactory{

    @Override
    public Engine createEngine() {
        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {
        return new LuxurySeat();
    }

    @Override
    public Tyre createTyre() {
        return new LuxuryTyre();
    }
    
}

class LowerCarFactory implements CarFactory{

    @Override
    public Engine createEngine() {
        return new LowerEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowerSeat();
    }

    @Override
    public Tyre createTyre() {
        return new LowerTyre();
    }
    
}

 

这里有一个魔法工厂,有一个默认工厂。魔法工厂生产Broom、MigicStick、Mushroom,默认工厂生产Car、AK47、Apple。一个工厂生产多种物品(对象)。具体的代码就不在这里打印出来了,看网址自己下载(代码借用尚学堂视频的,他们写的很简单易懂,懒得自己写了):http://download.csdn.net/detail/worsun/9436800

3、工厂方法(静态工厂模式)

这个比较简单,就是根据传入不同的参数构建不同的对象。如下:

if(type == 1){

  new object1();

}else{

  new object2();

}

转载于:https://www.cnblogs.com/worsun/p/5201301.html

  • 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、付费专栏及课程。

余额充值