设计模式与应用:简单工厂模式
程序员文章站
2024-01-20 16:51:52
...
本文介绍简单工厂、使用场景
简介
简单工厂模式属于类的创建型模式,又叫静态工厂方法模式。
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
角色和职责
- 工厂角色(Creator):核心。负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象
- 抽象角色(Product):工厂创建所有对象的父类。负责描述所有实例所有共有的公共接口
- 具体产品(Concrete Product):工厂创建的具体实例对象
实现
抽象接口
package com.mym.designmodel.SimpleFactory;
/**
* 职责:product 抽象对象
*/
public interface Animal {
public void shout();//定义动物的喊叫方法
}
具体实例对象类1
package com.mym.designmodel.SimpleFactory;
/**
* 职责:concreteProduct 具体对象
*/
public class Cat implements Animal{
@Override
public void shout() {
System.out.println("喵喵!");
}
}
具体实例对象类2
package com.mym.designmodel.SimpleFactory;
/**
* 职责:concreteProduct 具体对象
*/
public class Dog implements Animal {
@Override
public void shout() {
System.out.println("汪汪!");
}
}
工厂类:这里提供两种方式生产实例。一般使用的是第一种,适应性更强。第二种虽然扩展性强,但是束缚了适应性
package com.mym.designmodel.SimpleFactory;
/**
* 职责:简单工厂
*/
public class SimpleFactory {
public static Animal getAnimal1(String type){
if("dog".equalsIgnoreCase(type)){
return new Dog();
}else if("cat".equalsIgnoreCase(type)){
return new Cat();
}else{
System.out.println("没有相应的实例对象!");
return null;
}
}
public static Animal getAnimal2(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
return (Animal) Class.forName(className).newInstance();
}
}
测试
package com.mym.designmodel.SimpleFactory;
/**
* 测试
*/
public class MainClass {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
Animal dog = SimpleFactory.getAnimal1("dog");
Animal cat = SimpleFactory.getAnimal1("cat");
dog.shout();
cat.shout();
System.out.println("----------------------");
Animal dog2 = SimpleFactory.getAnimal2("com.mym.designmodel.SimpleFactory.Dog");
Animal cat2 = SimpleFactory.getAnimal2("com.mym.designmodel.SimpleFactory.Cat");
dog2.shout();
cat2.shout();
}
}
执行:
汪汪!
喵喵!
----------------------
汪汪!
喵喵!
简单工厂模式优缺点
优点
工厂类是核心。它包含必要的判断逻辑,能够根据外界给定的信息决定创建哪个具体类的对象。用户在使用时可以知己根据工厂类去创建所需实例,而无需了解这些对象如何创建如何组织。有利于整个软件体系结构的优化。
缺点
同样体现在其工厂类上,它集中所有实例的创建逻辑。所以“高内聚”方面坐的并不好。另外当系统具体产品不断增多,可能会要求工厂类也做相应的修改。扩展性不好。
使用场景
dao层对应各个数据库的支持
可以使用在模块开发中,工厂相当于一个借口,其他使用者只管从工厂中拿对象,对相关的生产和类型由工厂的维护者或者对象的创建者维护。
计算器的简单工厂模式实现思路
(1)首先加减乘除操作在客户端写,代码冗余,并且是面向过程的思路
(2)把加减乘除操作提炼出来到一个操作工厂中。客户端只需要调用工厂中的操作方法即可,内部操作由工厂实现。
可查看:工厂方法模式
上一篇: python --图像处理opencv