工厂模式(Java)

1:概述

        工厂模式:主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

        工厂模式分类:1)简单工厂模式(Simple Factory);2)工厂方法模式(Factory Method);3)抽象工厂模式(Abstract Factory)。这三种模式从上到下逐步抽象,并且更具一般性。

        将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

2:区别  

        工厂方法模式:一个抽象产品类,可以派生出多个具体产品类;一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。

        抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。

        区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个;工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

3:代码实现

1:简单工厂模式Coding:

        一个抽象的接口,多个抽象接口的实现类,一个工厂类,用来实例化抽象接口的实现类。

//抽象类接口:动物
interface Animal {
	
	public void say();
}
//实现接口:狗
class Dog implements Animal {

	@Override
	public void say() {
		System.out.println("汪汪汪");
	}

}
//实现接口:猫
class Cat implements Animal {

	@Override
	public void say() {

		System.out.println("喵喵喵");
	}

}
//动物工厂
class AnimalFactory {
	
	使用 getAnimalSay 方法获取Animal类型的对象
	public Animal getAnimalSay(String animalType){
		if(animalType==null){
			return null;
		}
		if(animalType.equalsIgnoreCase("Dog")){
			return new Dog();
		}else if(animalType.equalsIgnoreCase("Cat")){
			return new Cat();
		}
		return null;
	}
}
//工厂测试方法
public class SimpleFactoryTest {
	public static void main(String[] args) {
		AnimalFactory animalFactory = new AnimalFactory();
		
		//获取Dog对象并调用它的say()方法
		Animal animal1 = animalFactory.getAnimalSay("Dog");
		animal1.say();
		
		//获取Cat对象并调用它的say()方法
		Animal animal2 = animalFactory.getAnimalSay("Cat");
		animal2.say();
	}
}

2:工厂方法模式Coding:

        工厂方法模式是对简单工厂方法模式的改进,在简单工厂方法模式中,如果传入的字符串出错或者没有,则简单工厂模式是不能创建对象的。而工厂方法模式是提供了多个工厂方法并分别创建对象。即有四个角色:抽象工厂模式、具体工厂模式、抽象产品模式、具体产品模式;不再是由一个工厂类去实例化具体的动物,而是由抽象工厂的子类去实例化动物。

//抽象类接口:动物
interface Animal {
	public void say();
}
//实现抽象类接口:猫
class Cat implements Animal {

	@Override
	public void say() {

		System.out.println("喵喵喵");
	}

}
//实现抽象类接口:狗
class Dog implements Animal {

	@Override
	public void say() {
		System.out.println("汪汪汪");
	}

}
//抽象的动物工厂
abstract class AnimalFactory {
	public abstract Animal create();
}
//具体子工厂实例化:猫
class CatFactory extends AnimalFactory {

	@Override
	public Animal create() {
		return new Cat();
	}
}
//具体子工厂实例化:狗
class DogFactory extends AnimalFactory {

	@Override
	public Animal create() {
		return new Dog();
	}
	
}
//工厂测试方法
public class FactoryPatternTest {
	public static void main(String[] args) {
		AnimalFactory catFactory = new CatFactory();
		Animal animal1 = catFactory.create();
		animal1.say();
		
		AnimalFactory dogFactory = new DogFactory();
		Animal animal2 = dogFactory.create();
		animal2.say();
	}
}

3:抽象工厂模式

        抽象工厂和工厂方法模式很相似,工厂方法模式几乎已经很完美的对对象的创建进行了包装,使得测试类中仅仅处理抽象产品角色提供的接口,但是使得对象的数量成倍增长,当产品种类非常多时,会出现大量的与之对象的工厂对象,这是我们不希望看到的,即工厂方法模式有一个问题为类的创建依赖工厂类,即,如果想拓展程序增加一种产品,就必须要对工厂类进行修改,这违背了设计模式的闭包原则,所以从设计角度考虑,有一定的问题。解决的方法就是抽象工厂模式,工厂模式中工厂只能生产单一的产品,而抽象工厂模式的工厂可以生产多个产品。利用抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能时,直接增加新的工厂类就可以了,不需要修改之前的代码。注:抽象工厂至少需要两个不同的产品种类。

        百科:每当抽象产品都有多于一个的具体子类的时候(Coding Demo:人有两名,动物有两只),工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(动物有两个具体类型:Dog and Cat)。抽象工厂模式提供两个具体工厂角色(Factory1和Factory2),分别对应于这两个具体产品角色,每一个具体工厂角色只负责一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

//抽象接口人
interface Person {
	public void say();
}
//实现人的接口:Peter
class Peter implements Person{

	@Override
	public void say() {

		System.out.println("I am Peter.");
	}
	
}
//实现人的接口:Rose
class Rose implements Person{

	@Override
	public void say() {

		System.out.println("I am Rose.");
	}
	
}
//抽象接口动物
interface Animal {
	public void say();
}
//实现动物接口:猫
class Cat implements Animal {
	@Override
	public void say() {

		System.out.println("喵喵喵");
	}

}
//实现动物接口:狗
class Dog implements Animal{

	@Override
	public void say() {

		System.out.println("汪汪汪");
	}
}
//抽象工厂
abstract class AbstractFactory {
	public abstract Animal createAnimal();
	public abstract Person createPerson();
}
//实例化Rose和她猫
class Factory1 extends AbstractFactory {

	@Override
	public Animal createAnimal() {
		return new Cat();
	}

	@Override
	public Person createPerson() {
		return new Rose();
	}

}
//实例化Peter和他的狗
class Factory2 extends AbstractFactory{

	@Override
	public Animal createAnimal() {
		return new Dog();
	}

	@Override
	public Person createPerson() {
		return new Peter();
	}
}
//抽象工厂测试
public class AbstractFactoryTest {
	public static void main(String[] args) {
		//Rose和她的猫
		Factory1 factory1 = new Factory1();
		Person person1 = factory1.createPerson();
		Animal animal1 = factory1.createAnimal();
		person1.say();
		animal1.say();
		
		//Peter和他的狗
		Factory2 factory2 = new Factory2();
		Person person2 = factory2.createPerson();
		Animal animal2 = factory2.createAnimal();
		person2.say();
		animal2.say();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工厂模式是一种创建型设计模式,它提供了一个创建对象的最佳方式。在工厂模式中,我们创建对象而不必将创建过程暴露给客户端,并且客户端使用工厂方法来创建对象。 在 Java 中,我们可以通过接口或抽象类来定义工厂方法,然后使用具体的类来实现这个接口或抽象类。这样一来,我们就可以将具体的实现隐藏在工厂方法中,而客户端只需要使用工厂方法来创建对象。 例如,我们可以定义一个接口 ShapeFactory,然后使用具体的类 CircleFactory 和 RectangleFactory 来实现这个接口。客户端只需要使用 ShapeFactory 来创建 Circle 或 Rectangle 对象,而不需要知道具体的实现细节。 下面是一个简单的工厂模式的示例代码: ```java // 定义形状接口 interface Shape { void draw(); } // 定义圆形类 class Circle implements Shape { public void draw() { System.out.println("画一个圆形"); } } // 定义矩形类 class Rectangle implements Shape { public void draw() { System.out.println("画一个矩形"); } } // 定义工厂接口 interface ShapeFactory { Shape createShape(); } // 定义圆形工厂类 class CircleFactory implements ShapeFactory { public Shape createShape() { return new Circle(); } } // 定义矩形工厂类 class RectangleFactory implements ShapeFactory { public Shape createShape() { return new Rectangle(); } } // 客户端代码 public class FactoryPatternDemo { public static void main(String[] args) { // 创建圆形 ShapeFactory circleFactory = new CircleFactory(); Shape circle = circleFactory.createShape(); circle.draw(); // 创建矩形 ShapeFactory rectangleFactory = new RectangleFactory(); Shape rectangle = rectangleFactory.createShape(); rectangle.draw(); } } ``` 在这个示例中,我们定义了一个 Shape 接口和两个具体的形状类 Circle 和 Rectangle。然后我们定义了一个 ShapeFactory 接口和两个具体的工厂类 CircleFactory 和 RectangleFactory,用于创建 Circle 和 Rectangle 对象。最后,我们在客户端代码中使用这些工厂类来创建对象,并调用对象的 draw 方法来画出形状。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值