设计模式系列
简单工厂模式
解释:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的类的实例通常都具有共同的父类。
简单工厂模式一般都含有以下三个角色:
1.Factory(工厂角色):该模式的核心,负责实现创建所有产品实例的内部逻辑。
2.Product(抽象产品角色):它是工厂类创建的所有产品对象的父类。
3.ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。
下面我将以一个例子来说明一下:
使用简单工厂模式来模拟女娲造人,如果向造人的工厂传入参数M,则返回一个男人对象,如果传入W,则返回一个女人对象,如果传入一个R,则返回一个机器人对象。
第一步:创建Person接口(抽象产品角色)
/**
* 定义一个造人的接口
*/
public interface Person {
/**
* 造人的方法
*/
void getPerson();
}
第二步:创建具体产品角色:造人的车间 : 男人 女人和机器人三个车间
/**
* 造男人的车间
*/
public class PersonMan implements Person{
/**
* 造男人的方法
*/
public void getPerson() {
//造男人的细节
System.out.println("男人产生了。。。");
}
}
/**
* 造机器人的车间
*/
public class PersonRobot implements Person{
/**
* 造机器人的方法
*/
public void getPerson() {
//造机器人的细节
System.out.println("机器人产生了。。。。");
}
}
/**
* 造女人的车间
*/
public class PersonWoman implements Person{
/**
*造女人的方法
*/
public void getPerson() {
//造女人的细节
System.out.println("女人产生了。。。。");
}
}
第三步:创建工厂角色:造人的工厂
/**
* 造人的工厂
*/
public class GetPersonFactory {
/**
* 定义要造的人
*/
Person person;
/**
* 造人的方法
*/
public Person getPerson(String personType){
//M则造男人 用造男人的车间
if("M".equals(personType)){
person = new PersonMan();
//如果是M 则造女人
}else if("W".equals(personType)){
person=new PersonWoman();
//如果是R 则造机器人
}else if("R".equals(personType)){
person=new PersonRobot();
}
return person;
}
}
以上已经完成了一个简单工厂模式 接下来我们进行测试:
/**
* 造人测试
*/
public class PersonTest {
@Test
public void NeedPerson(){
GetPersonFactory getPersonFactory=new GetPersonFactory();
//获取造人的车间
Person person = getPersonFactory.getPerson("W");
//调用车间造人的方法 开始造人
person.getPerson();
System.out.println(person);
}
}
控制台会输出:
女人产生了。。。。
DesignPattern.SimpleFactory.PersonWoman@13a5fe33
至此简单工厂模式搞定并测试通过。
最后再说下简单工厂模式的优缺点以及使用的场景:
优点:
1.工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。简单工厂模式实现了对象创建和使用的分离。
2.客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
缺点:
1.由于工厂类集中了所有的产品逻辑,所以一旦不能正常工作整个系统的造人都会受到影响。
2.增加了类的个数(引入了新的工厂类)。
3.系统扩展困难,一旦需要添加新产品(造阴阳人等)就不得不修改工厂逻辑。
适用场景:
1.工厂类负责创建的对象比较少,由于对象比较少,不会造成工厂方法中的业务逻辑太过复杂。
2.客户端只知道传入工厂类(造人的工厂)的参数,对于如何创建对象(造人车间)并不关心。