前言
简单工厂模式是工厂设计模式的一种简单实现,通过一个工厂对象传入不同的参数构造出不同的对象。
一、简单工程模式UML图
简单工厂模式构成角色如下表所示。
对象 | 角色 |
---|---|
SimpleFactory | 简单工厂,根据传入的参数生成Product对象,依赖Product对象 |
Product | 产品抽象对象 |
ContentProduct | 具体的产品,继承Product,ContentProduct是多个不同的Product对象,在UML图中统一用ContentProduct来表示。 |
二、代码案例
我们来创建一个简单动物工厂类SimpleFactory,用于创建各种动物,各种动物对象就相当于Porduct角色。简单工厂模式又叫做静态工厂方法,一般用于创建对象的方法都是静态的,该方法根据预设传入的参数创建不同对象,并将该对象返回。
public class AnimalSimpleFactory {
public static Animal animal;//动物抽象对象
public static Animal createAnimal(String animalName) {
switch(animalName) {
case "dog":
animal = new Dog();
break;
case "cat":
animal = new Cat();
break;
default:
animal = null;
System.out.println("该动物没有实现");
}
return animal;
}
}
接下来我们创建一个动物类,担任Product(产品)角色。动物类是一个抽象类,有可定义共同的行为,其他差异行为可由子类具体实现。
public abstract class Animal {
public abstract void eat();
public void metabolism() {
System.out.print("新陈代谢");
}
}
创建一个Cat(猫)类,担任ContectProduct(具体产品)角色,继承Animal类。
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃老鼠");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
建立一个测试类,调用和=AnimalSimpleFactory(简单动物工程)对象创建动物的方法,并传入预设的参数,工厂返回我们想要的对象。
public class test {
public static void main(String[] args) {
Animal animal = AnimalSimpleFactory.createAnimal("dog");
animal.eat();
animal = AnimalSimpleFactory.createAnimal("cat");
animal.eat();
}
}
总结
优点
1、工厂类含有创建产品的逻辑,可以在不同的时刻通过参数决定工厂生产什么产品,也可以通过配置文件决定。
2、客户端不在范负责产品的产生,只需要与工厂类和抽象产品对象即可,降低了代码的耦合性。
缺点
1、违背了开闭原则,每次要添加一个产品都要修改工程类
2、如果产品无限增加,带来了复杂的业务逻辑,不利于维护
3、使用了静态方法,破坏了继承
使用场景分析
简单工厂模式封装了对象的创建,客户端可以不用关心对象创建逻辑,只需要知道创建参数即可。在创建代码逻辑足够简单,我们可以把产品对象的创建逻辑封装到简单工厂中,在此条件下稍微违背开闭原则也是允许的。