设计模式之简单工厂模式
程序员文章站
2022-05-23 16:02:05
...
设计模式之简单工厂模式:
简单工厂模式(感觉可以称为对象生成工厂)的概念:
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
简单工厂模式的实质是由一个工厂类根据传入的参数,
动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
简单工厂模式的实例:
早晨,hmy很饿,想吃吃早餐(Breakfast),早餐有包子(baozi)、油条(youtiao)
以及豆浆(doujiang)。
早餐(Breakfast)是基类(父类),种类(type)是包子、油条和豆浆共有方法,
即后三者继承前者(接口亦可)。
定义一个基类Breakfast(接口也行):
package com.mzsds.easyFactory;
public abstract class Breakfast {
public abstract void type();
}
三个子类(baozi、youtiao以及doujiang):
package com.mzsds.easyFactory;
public class baozi extends Breakfast {
public void type() {
System.out.println("吃包子。");
}
}
package com.mzsds.easyFactory;
public class youtiao extends Breakfast {
public void type() {
System.out.println("吃油条。");
}
}
package com.mzsds.easyFactory;
public class doujiang extends Breakfast {
public void type() {
System.out.println("喝豆浆。");
}
}
定义一个工厂类(BreakfastFactory):
package com.mzsds.easyFactory;
public class BreakfastFactory {
public static Breakfast createBreakfast(String kind) {
Breakfast breakfast = null;
switch (kind) {
case "baozi": {
breakfast = new baozi();
break;
}
case "youtiao": {
breakfast = new youtiao();
break;
}
case "doujiang": {
breakfast = new doujiang();
break;
}
}
return breakfast;
}
}
测试:
package com.mzsds.easyFactory;
public class Client {
public static void main(String[] args) {
Breakfast breakfast;
breakfast = BreakfastFactory.createBreakfast("baozi");
breakfast.type();
breakfast = BreakfastFactory.createBreakfast("youtiao");
breakfast.type();
breakfast = BreakfastFactory.createBreakfast("doujiang");
breakfast.type();
}
}
输出结果:
吃包子。
吃油条。
喝豆浆。
简单工厂模式的优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,
客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。
简单工厂模式通过这种做法实现了对责任的分割。
简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
通过它,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来。
外界与具体类隔离开来,偶合性低。明确区分了各自的职责和权力,
有利于整个软件体系结构的优化。
简单工厂模式的缺点:
当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。
因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑
(如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支),
有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP)。
另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,
造成工厂角色无法形成基于继承的等级结构。
·简单工厂模式只是解决了对象创建问题,由于工厂本身包括了所有的对象创建方式, 如果有经常性变动的需求,则每次维护和扩展方式都要改动这个工厂。
·我的理解:简单工厂模式是通过实例对象名参数工厂类生产不同实例对象的过程
(客户端发送参数调用工厂,工厂通过参数去new对象,客户端得到对象后调用对象方法)
(客户端和对象的分离)