目录
1.工厂方法模式概念
当创建对象时,我们不会对构造类的对象进行实例化。这是通过为不同类型的对象调用一个公共的接口来完成的。
2.工厂方法组成部分
1)抽象工厂(Creator)
声明一个用于创建产品的工厂方法。
2)具体工厂(Concrete Creator)
实现抽象工厂中的工厂方法,用于创建一个具体产品对象。
3)抽象产品(Product)
定义了产品的规范,即所有产品共有的公共接口。
4)具体产品(Concrete Product)
由具体工厂创建,实现抽象产品接口。
3.举个栗子:
如下图:
注:对象的创建过程交给工厂了,我们负责使用,不直接和对象类打交道,而是和工厂打交道.
主要部分:
- Animal(动物):这是一个抽象产品类,定义了所有动物的公共接口。
- Cat(猫):实现Animal接口的具体产品类。
- Fish(鱼):实现Animal接口的具体产品类。
- AnimalFactory(动物工厂):这是一个抽象工厂类,定义了创建Animal对象的接口。
- CatAnimalFactory(猫动物工厂):实现AnimalFactory接口的具体工厂类,用于创建Cat对象。
- FishAnimalFactory(鱼动物工厂):实现AnimalFactory接口的具体工厂类,用于创建Fish对象。
工厂方法模式的使用流程:
- AnimalFactory创建一个Animal对象,并调用其
shout()
方法。 - CatAnimalFactory创建一个Cat对象,并调用其
shout()
方法。 - FishAnimalFactory创建一个Fish对象,并调用其
shout()
方法。
通过这种方式,客户端可以通过调用工厂方法来获取具体的产品对象,而无需关心这些对象的具体实现。这种模式使得系统更容易扩展,因为可以添加新的工厂和产品类,而不会影响到现有的代码。
4.代码实现
1)抽象产品
Animal
package org.xiji.fucFactory;
/**
* 动物抽象接口
*/
public interface Animal {
/**
* 动物叫声
*/
void shout();
}
这段代码定义了一个叫做 Animal 的接口。这个接口是用来描述所有动物共有的行为。在这个接口中,我们定义了一个方法 shout,表示动物会发出叫声。具体来说:
· 接口:Animal 是一个接口,它描述了所有动物应该具备的行为。
· 方法:shout 方法表示动物会发出叫声。这个方法没有参数,也不返回任何值。
· 实现:任何实现了 Animal 接口的类都需要提供 shout 方法的具体实现。也就是说,每个具体的动物类需要定义它是怎么叫的。
2)具体产品
Cat
这段代码定义了一个具体的动物类 Cat,它实现了 Animal 接口。
· 接口:Animal 是一个接口,它描述了所有动物应该具备的行为。在这个接口中,我们定义了一个shout 方法,表示动物会发出叫声。
· 具体实现:Cat 类实现了 Animal 接口,并具体实现了 shout 方法。当调用 shout 方法时,它会输出 "猫:喵喵喵"。
package org.xiji.fucFactory;
public class Cat implements Animal{
@Override
public void shout() {
System.out.println("猫:喵喵喵");
}
}
Fish
定义了一个具体的动物类 Fish,它实现了 Animal 接口。
· 接口:Animal 是一个接口,它描述了所有动物应该具备的行为。在这个接口中,我们定义了一个 shout 方法,表示动物会发出叫声。
· 具体实现:Fish 类实现了 Animal 接口,并具体实现了 shout 方法。当调用 shout 方法时,它会输出 "鱼: ········"。
package org.xiji.fucFactory;
/**
* 鱼
*/
public class Fish implements Animal{
@Override
public void shout() {
System.out.println("鱼:········");
}
}
3)抽象工厂
AnimalFactory
这段代码定义了一个名为 AnimalFactory 的抽象类。
· 抽象类:AnimalFactory 是一个抽象类,它定义了创建动物的基本行为。抽象类不能直接实例化,只能被继承。
· 抽象方法:createAnimal 方法是一个抽象方法,表示创建一个动物对象。具体实现由子类提供。
package org.xiji.fucFactory;
/**
* 定义动物工厂接口
*/
public abstract class AnimalFactory {
/**
*
* 创建动物
*/
public abstract Animal createAnimal();
}
4)具体工厂
CatAnimalFactory
这段代码定义了一个名为 CatAnimalFactory 的具体工厂类,它继承自 AnimalFactory。
· 抽象类:AnimalFactory 是一个抽象类,它定义了创建动物的基本行为。抽象类不能直接实例化,只能被继承。
· 抽象方法:createAnimal 方法是一个抽象方法,表示创建一个动物对象。具体实现由子类提供。
· 具体实现类:CatAnimalFactory 类继承自 AnimalFactory,并重写了 createAnimal 方法,具体实现了创建猫的对象。
package org.xiji.fucFactory;
public class CatAnimalFactory extends AnimalFactory{
@Override
public Animal createAnimal() {
return new Cat();
}
}
FishAnimalFactory
这段代码定义了一个名为 FishAnimalFactory 的具体工厂类,它继承自 AnimalFactory。
· 抽象类:AnimalFactory 是一个抽象类,它定义了创建动物的基本行为。抽象类不能直接实例化,只能被继承。
· 抽象方法:createAnimal 方法是一个抽象方法,表示创建一个动物对象。具体实现由子类提供。
· 具体实现类:FishAnimalFactory 类继承自 AnimalFactory,并重写了 createAnimal 方法,具体实现了创建鱼的对象。
package org.xiji.fucFactory;
public class FishAnimalFactory extends AnimalFactory{
@Override
public Animal createAnimal() {
return new Fish();
}
}
4.测试代码:
FucFactoryMain
这段代码定义了一个测试类 FucFactoryMain,用于展示如何使用具体的工厂类来创建动物对象,并让它们发出叫声。:
· 抽象类:AnimalFactory 是一个抽象类,它定义了创建动物的基本行为。抽象类不能直接实例化,只能被继承。
· 抽象方法:createAnimal 方法是一个抽象方法,表示创建一个动物对象。具体实现由子类提供。
· 具体实现类:
· CatAnimalFactory 类继承自 AnimalFactory,并重写了 createAnimal 方法,具体实现了创建猫的对象。
· FishAnimalFactory 类继承自 AnimalFactory,并重写了 createAnimal 方法,具体实现了创建鱼的对象。
· 测试类:FucFactoryMain 类用于测试具体的工厂类和动物类。在 main 方法中,我们创建了 CatAnimalFactory 和 FishAnimalFactory 对象,并通过它们创建具体的动物对象。最后调用 shout 方法让动物发出叫声。
package org.xiji.fucFactory;
/**
* 方法工厂模式测试类
*/
public class FucFactoryMain {
public static void main(String[] args) {
/**
* 想要一直猫
*
* 猫工厂=====>猫===》叫
*/
AnimalFactory animalFactory = new CatAnimalFactory();
Animal cat = animalFactory.createAnimal();
cat.shout();
/**
* 想要一只鱼
*/
AnimalFactory animalFactory1 = new FishAnimalFactory();
Animal fish = animalFactory1.createAnimal();
fish.shout();
}
}
5.运行结果
附录:
1)23种设计模式讲解地址
23种设计模式讲解地址
专题地址:https://blog.csdn.net/2301_76862031/category_12779841.html
设计模式之访问者模式地址: https://blog.csdn.net/2301_76862031/article/details/141716629
设计模式之简单工厂模式地址: https://blog.csdn.net/2301_76862031/article/details/141641161
设计模式之策略模式工厂地址:https://blog.csdn.net/2301_76862031/article/details/141647304
设计模式之备忘录模式地址: https://blog.csdn.net/2301_76862031/article/details/141678153
设计模式之代理模式: https://blog.csdn.net/2301_76862031/article/details/141681834
设计模式之单例模式: https://blog.csdn.net/2301_76862031/article/details/141684340
设计模式之迭代器模式: https://blog.csdn.net/2301_76862031/article/details/141690379
设计模式之观察者模式:https://blog.csdn.net/2301_76862031/article/details/141723684
设计模式之命令模式: https://blog.csdn.net/2301_76862031/article/details/141728371
设计模式之模板方法模式: https://blog.csdn.net/2301_76862031/article/details/141729898
设计模式之桥接模式: https://blog.csdn.net/2301_76862031/article/details/141748997
设计模式之适配器模式: https://blog.csdn.net/2301_76862031/article/details/141752130
设计模式之外观模式: https://blog.csdn.net/2301_76862031/article/details/141753019
设计模式之享元模式: https://blog.csdn.net/2301_76862031/article/details/141755905
设计模式之原型模式: https://blog.csdn.net/2301_76862031/article/details/141759296
设计模式之责任链模式: https://blog.csdn.net/2301_76862031/article/details/141760704
设计模式之中介模式: https://blog.csdn.net/2301_76862031/article/details/141777728
设计模式之装饰者模式: https://blog.csdn.net/2301_76862031/article/details/141784167
设计模式之状态模式: https://blog.csdn.net/2301_76862031/article/details/141786766
设计模式之组合模式: https://blog.csdn.net/2301_76862031/article/details/141787708
设计模式之工厂方法模式: https://blog.csdn.net/2301_76862031/article/details/141826862
设计模式之解释器模式: https://blog.csdn.net/2301_76862031/article/details/141859953