Java工厂模式

工厂模式就是帮助调用创建对象的,实现了创建者和调用者的分离;
使用java原始创建对象的方式:
在类A 中要创建 类B的实例,以前我们使用

B b = new B();

此时类A和类B是直接产生关系了的(当这样的场景大量出现,彼此间关系会显得混乱,不好梳理)
工厂模式就是让创建者A 与 被创建者B 之间不再直接产生关系,而是通过“第三者”工厂间接的维持关系。

# 工厂模式分类:

  1. 简单工厂模式
  2. 工厂方法模式
  3. 抽象工厂模式
简单工厂模式(使用最多)

通常我们对于同一级别(大概就是类似的意思)的类对象,我们使用简单工厂模式来同一管理这些类的创建。
举例有两个类:Dog 和 Pig 它们有共性:都能跑 所以我们抽取出一个接口 : Animal 约束它们的行为

public interface Animal { 
	void run(); 
} 

public class Dog() implements Animal {
	@Override
	public void run(){
		//实现
	}
}

public class Pig() implements Animal {
	@Override
	public void run(){
	  //实现
	}
}

然后我们 创建一个AnimalFactory的工厂类:其中类型判断随意,根据不同类型,创建不同的类型,同一返回共同实现的接口类型,

public static Animal createAnimal(int type){
	if(type == 1){
	   return new Dog();
	}else if(type == 2){
	   return new Pig();
	}
	return null;
}
{
	//调用者在创建时都不会与被创建对象直接产生关系,而是有创建工厂代替
	//在有新的对象时,只需要修改工厂的结构即可
	Animal anl1 = AnimalFactory.createAnimal(1);	//创建狗
	Animal anl1 = AnimalFactory.createAnimal(2);	//创建猪
}
工厂方法模式

使用上面Dog 、 Pig 类 和 Animal接口,在工厂方法模式中,AnimalFactory 不再直接创建对象,而是定义成一个接口类约束工厂行为,然后分别创建Dog 和 Pig 对应的工厂类,同一实现接口

public interface AnimalFactory {
 	Animal createAnimal();
}
public class DogFactory implements AnimalFactory{
	 @Override
	 public Animal createAnimal() {
	  	return new Dog();
	 }
}
public class PigFactory implements AnimalFactory{
	@Override
	public Animal createAnimal() {
	  	return new Pig();
 	}
}

创建者在使用的时候只需要通过各自的工厂类来创建对象:

	Animal anl1 = new DogFactory().createAnimal();	
	Animal anl2 = new PigFactory().createAnimal();
  	anl1.run();
	anl2.run();

如果此时需要用到另一个Horse类,调用者只需要,创建一个对应的工厂类就可以完成创建,不会对原有代码做任何修改(OCP开闭原则)

抽象工厂模式

不怎么好解释,那天想到一个好的说法在补上吧。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java工厂模式是一种创建对象的设计模式,它提供了一种将对象的创建与使用分离的方式。通过使用工厂模式,我们可以通过调用工厂类的方法来创建对象,而不需要直接使用new关键字实例化对象。 在Java中,工厂模式通常包括以下几个角色: 1. 抽象产品(Product):定义了产品的接口,是具体产品类的父类或接口。 2. 具体产品(Concrete Product):实现了抽象产品接口的具体类。 3. 抽象工厂(Abstract Factory):定义了创建产品的接口,可以是抽象类或接口。 4. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品的对象。 下面是一个简单的Java工厂模式实例: 首先,我们定义一个抽象产品接口(Product): ```java public interface Product { void use(); } ``` 然后,我们定义两个具体产品类(Concrete Product)实现抽象产品接口: ```java public class ConcreteProductA implements Product { @Override public void use() { System.out.println("使用产品A"); } } public class ConcreteProductB implements Product { @Override public void use() { System.out.println("使用产品B"); } } ``` 接下来,我们定义一个抽象工厂接口(Abstract Factory): ```java public interface Factory { Product createProduct(); } ``` 然后,我们定义两个具体工厂类(Concrete Factory)实现抽象工厂接口: ```java public class ConcreteFactoryA implements Factory { @Override public Product createProduct() { return new ConcreteProductA(); } } public class ConcreteFactoryB implements Factory { @Override public Product createProduct() { return new ConcreteProductB(); } } ``` 最后,我们可以使用具体工厂来创建具体产品对象: ```java public class Main { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.use(); Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.use(); } } ``` 这样,通过工厂模式,我们可以通过调用具体工厂的方法来创建具体产品的对象,而不需要直接使用new关键字实例化对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值