1.背景
(1)首先理解什么是工厂?
为了方便理解,这里就不用专业词汇描述,个人感觉工厂就是生产各种各样商品的地方。而对于java来说就是new出各种各样的对象。
例如:上面的事例,客户需要一个猫,工厂就得new一个猫对象,需要一个狗,就需要new一个狗对象。
1.1不用工厂代码
猫:
public class Cat {
}
狗:
public class Dog {
}
客户(也可以称之为消费者) :
public class Customer {
public static void main(String[] args) {
//买了一只猫
Cat cat = new Cat();
//买了一只狗
Dog dog = new Dog();
}
}
客户类main方法里面的代码,存在如下问题?
对于我们客户来说,去宠物店,只需要知道,这个宠物店,有哪些动物就行,而不需要知道,关于这些动物是怎么来的。
这也是我们开发中,很重要的一个思想,业务逻辑解耦,各自只关心,各自的模块。
1.2.使用简单工厂模式
public interface Animal {
public void eat();
}
public class AnimalFactory {
public static Animal productAnimal(String msg){
if(msg.equals("猫")){
return new Cat();
}else if(msg.equals("狗")){
return new Dog();
};
return null;
};
}
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("猫正在吃鱼。。。");
}
}
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("狗正在吃骨头。。。");
}
}
public class Customer {
public static void main(String[] args) {
AnimalFactory.productAnimal("猫").eat();
AnimalFactory.productAnimal("狗").eat();
}
}
使用简单工厂模式,首先,得分析每个产品的共性,例如,猫和狗,都是动物,所以,抽取勒一个动物接口。再有,就是具有一定的逻辑,根据,传的猫和狗的值不同,工厂创建的对象也不同,这就是简单工厂模式。
1.2.1 可扩展性不强
不遵循"开闭原则"。
什么是开闭原则?
一个软件应该通过扩展来实现变化,而不是修改已有代码来实现变化。
说到这里,分析一下,上面的工厂demo,已有猫,狗,如果现在需要增加一个猪,工厂的代码就得变化
public class AnimalFactory {
public static Animal productAnimal(String msg){
if(msg.equals("猫")){
return new Cat();
}else if(msg.equals("狗")){
return new Dog();
}else if(msg.equals("猪")){
return new Pig();
};
return null;
};
}
2.描述
顾名思义就是这个工厂很简单,能在业务简单的情况下使用。
3.关键点
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,在java中往往由一个类实现
抽象产品角色:它一般是具体产品的父类或者需要实现的接口,在Java中由接口或者抽象类实现。
具体产品角色:工厂类所创建的对象就是此角色的实例,在java中由一个具体类实现。