共计 6886 个字符,预计需要花费 18 分钟才能阅读完成。
文章目录:
1. 工厂模式介绍
工厂模式(Factory Pattern) 是 Java 中最罕用的设计模式之一。这种类型的设计模式属于创立型模式,它提供了一种创建对象的最佳形式。在工厂模式中,咱们在创建对象时不会对客户端裸露创立逻辑,并且是通过应用一个独特的接口来指向新创建的对象。
简略来说就是: 咱们创立一个工厂类,而后当调用者想要创立一个对象时,只须要通知工厂类即可,由工厂类去创建对象,调用者无需晓得是如何创立的,也不必本人去创立。
再形象点说就是: 比方咱们须要购买一批电脑,咱们只有把咱们的需要通知电脑工厂,电脑工厂就会帮咱们把这批电脑做好,而咱们是不必本人去做这个电脑的,也不必咱们本人去晓得这个电脑是怎么做进去的,这就是工厂模式。
工厂模式分为 简略工厂模式 , 工厂办法模式 , 形象工厂模式,它们都属于设计模式中的创立型模式。其次要性能都是帮忙咱们把对象的实例化局部抽取了进去,目标是升高零碎中代码耦合度,并且加强了零碎的扩展性。
上面就别离来看一下 3 种工厂模式。
2. 工厂模式——简略工厂模式
2.1 简略工厂模式介绍
简略工厂,简略工厂,天然是实现很简略。简略工厂模式只是将不同对象的创立操作进行了一层简略的封装,其实也就是把不同对象的创立操作全都独自放到一个类中,这个类就成为了简略工厂类;当咱们须要某个对象时,只需把咱们的需要通知这个简略工厂类,而后由这个简略工厂类依据咱们的需要去创立对应的对象即可。
2.2 简略工厂模式实现
- 咱们以电脑为例子,实现一个电脑工厂,由电脑工厂依据需要生成不同品牌的电脑。
1. 创立一个电脑抽象类
public abstract class Computer {public abstract void use();
}
2. 创立继承了电脑抽象类的,具体的不同品牌的电脑的实体类
public class HaseeComputer extends Computer {public HaseeComputer() {System.out.println("生产了神舟电脑");
}
@Override
public void use() {System.out.println("应用了神舟电脑");
}
}
public class LenovoComputer extends Computer {public LenovoComputer() {System.out.println("生产了联想电脑");
}
@Override
public void use() {System.out.println("应用了联想电脑");
}
}
3. 创立一个电脑工厂
public class ComputerFactory {public static Computer produceComputer(String computerBrand) {if (computerBrand == null) {return null;}
if (computerBrand.equalsIgnoreCase("Hasee")) {return new HaseeComputer();
}else if (computerBrand.equalsIgnoreCase("Lenovo")) {return new LenovoComputer();
}
return null;
}
}
4. 测试:应用工厂生产不同品牌电脑并应用
public class FactoryTest {public static void main(String[] args) {ComputerFactory computerFactory = new ComputerFactory();
Computer haseeComputer = computerFactory.produceComputer("Hasee");
haseeComputer.use();
Computer lenovoComputer = computerFactory.produceComputer("Lenovo");
lenovoComputer.use();}
}
2.3 简略工厂模式的优缺点
长处: 简略工厂模式能够依据需要,动静生成使用者所需类的对象,而使用者不必去晓得怎么创建对象,使得各个模块各司其职,升高了零碎的耦合性。
毛病: 扩展性差,违反了 开闭准则(开闭准则指的是:软件实现应该对扩大凋谢,对批改敞开)。新增产品时,须要批改工厂类。
比方下面的实现样例中,如果咱们须要一个苹果电脑时,原有的工厂类就无奈生产这个苹果电脑了,这个时候就须要去批改工厂类了。
3. 工厂模式——工厂办法模式
3.1 工厂办法模式的介绍
在简略办法中,咱们是只有一个工厂类,由这个工厂类负责动静的创立咱们所须要的对象;而在工厂办法模式中,咱们的工厂类上面还有很多子工厂类,咱们须要的对象是由这些子工厂类来创立的。其实就是改良了简略工厂模式,因为当咱们须要一个新产品时,只须要扩大一个新的子工厂类即可,而不必去批改原有的代码,这样就合乎了开闭准则。
3.2 工厂办法模式的实现
- 咱们还说以电脑为例子,实现一个电脑工厂,再依据不同品牌实现电脑工厂子类,由电脑工厂子类依据需要生成不同品牌的电脑。
1. 创立一个电脑抽象类
public abstract class Computer {public abstract void use();
}
2. 创立继承了电脑抽象类的,具体的不同品牌的电脑的实体类
public class LenovoComputer extends Computer {public LenovoComputer() {System.out.println("生产了联想电脑");
}
@Override
public void use() {System.out.println("生产了联想电脑");
}
}
public class HaseeComputer extends Computer {public HaseeComputer() {System.out.println("生产了神舟电脑");
}
@Override
public void use() {System.out.println("应用了神舟电脑");
}
}
3. 创立一个电脑形象工厂类
public abstract class ComputerFactory {public abstract Computer produce();
}
4. 创立电脑形象工厂类的子类(依据不同的电脑品牌)
public class LenovoFactory extends ComputerFactory {
@Override
public Computer produce() {return new LenovoComputer();
}
}
public class HaseeFactory extends ComputerFactory {
@Override
public Computer produce() {return new HaseeComputer();
}
}
5. 测试:应用不同子工厂生产不同品牌电脑并应用
public class FactoryTest {public static void main(String[] args) {ComputerFactory haseeFactory = new HaseeFactory();
Computer haseeComputer = haseeFactory.produce();
haseeComputer.use();
ComputerFactory lenovoFactory = new LenovoFactory();
Computer lenovoComputer = lenovoFactory.produce();
lenovoComputer.use();}
}
3.3 工厂办法模式的优缺点
长处: 扩展性好,合乎了开闭准则 ,新增一种产品时,只需减少改对应的产品类和对应的工厂子类即可。比方样例实现中,当咱们须要一个苹果电脑时,只须要去新增一个苹果电脑类和一个苹果工厂类即可,而无需去批改原有的代码。 合乎繁多职责准则,每个工厂只负责一种产品,而不是由一个工厂去生成所有商品。
毛病: 当咱们新增产品时,还须要提供对应的工厂类,零碎中类的个数将会成倍增加,相当于减少了零碎的复杂性。
4. 工厂模式——形象工厂模式
4.1 形象工厂模式的介绍
形象工厂模式有点像是工厂办法模式的升级版。
工厂办法模式针对的某一种产品,而形象工厂模式能够针对多种产品。
意思就是:工厂办法模式解决的是生产不同品牌的同一类型的电脑。而形象工厂模式解决的是生产不同品牌的多种类型的电脑。
再文言些就是:工厂办法模式中的 联想电脑工厂 只能生产老式的台式电脑,而如果当初须要生产 台式电脑,笔记本电脑,平板电脑 等多个品种的电脑的话,那么工厂办法模式就不太不便了。而形象工厂模式能够解决 联想电脑工厂 生产多个品种电脑的问题,也就是解决一个工厂生产多种类型的产品的问题。
4.2 形象工厂模式的实现
- 咱们仍旧用电脑为列子,实现一个电脑工厂,再依据不同品牌实现电脑工厂子类,由电脑工厂子类依据需要生成不同品牌的不同品种的电脑。
1. 创立各种类型的电脑抽象类
public abstract class DesktopComputer {public abstract void use();
}
public abstract class NotebookComputer {public abstract void use();
}
2. 创立具体的不同品牌的各种类型的电脑实体类
public class HaseeDesktopComputer extends DesktopComputer {public HaseeDesktopComputer() {System.out.println("生产了神舟台式电脑");
}
@Override
public void use() {System.out.println("应用了神舟台式电脑");
}
}
public class HaseeNotebookComputer extends NotebookComputer {public HaseeNotebookComputer() {System.out.println("生产了神舟笔记本电脑");
}
@Override
public void use() {System.out.println("生产了神舟笔记本电脑");
}
}
public class LenovoDesktopComputer extends DesktopComputer {public LenovoDesktopComputer() {System.out.println("生产力联想台式电脑");
}
@Override
public void use() {System.out.println("应用了联想台式电脑");
}
}
public class LenovoNotebookComputer extends NotebookComputer {public LenovoNotebookComputer() {System.out.println("生产了联想笔记本电脑");
}
@Override
public void use() {System.out.println("应用了联想笔记本电脑");
}
}
3. 创立一个电脑的形象工厂类
public abstract class ComputerFactory {public abstract DesktopComputer produceDesktopComputer();
public abstract NotebookComputer produceNotebookComputer();}
4. 创立电脑形象工厂类的子类(依据不同的电脑品牌)
public class HaseeFactory extends ComputerFactory {
@Override
public DesktopComputer produceDesktopComputer() {return new HaseeDesktopComputer();
}
@Override
public NotebookComputer produceNotebookComputer() {return new HaseeNotebookComputer();
}
}
public class LenovoFactory extends ComputerFactory {
@Override
public DesktopComputer produceDesktopComputer() {return new LenovoDesktopComputer();
}
@Override
public NotebookComputer produceNotebookComputer() {return new LenovoNotebookComputer();
}
}
5. 测试:应用不同子工厂创立不同品牌的不同品种的电脑
public class TestFactory {public static void main(String[] args) {ComputerFactory haseeFactory = new HaseeFactory();
DesktopComputer haseeDesktopComputer = haseeFactory.produceDesktopComputer();
haseeDesktopComputer.use();
NotebookComputer haseeNotebookComputer = haseeFactory.produceNotebookComputer();
haseeNotebookComputer.use();
ComputerFactory lenovoFactory = new LenovoFactory();
DesktopComputer lenovoDesktopComputer = lenovoFactory.produceDesktopComputer();
lenovoDesktopComputer.use();
NotebookComputer lenocoFactory = lenovoFactory.produceNotebookComputer();
lenocoFactory.use();}
}
4.3 形象办法模式的优缺点
长处: 工厂抽象类创立了多个类型的产品,当有需要时,能够创立相干产品子类和子工厂类来获取。也就是能够满足生产不同品牌的不同类型的电脑。
简略来说就是: 开始咱们的工厂办法模式,如果咱们须要台式电脑,又须要笔记本电脑,要多种产品时,工厂办法模式无奈满足咱们的需要;而形象办法模式,提前在形象工厂中,定义好了可能须要的多种产品,比方 台式电脑,笔记本电脑,平板电脑等,当有需要的时候,咱们只须要创立相干子类和相干子工厂类即可。
毛病: 扩大新品种产品时艰难。形象工厂模式须要咱们在工厂抽象类中提前确定了可能须要的产品种类,以满足不同品牌的多种产品的需要。然而如果咱们须要的产品种类并没有在工厂抽象类中提前确定,那咱们就须要去批改工厂抽象类了,而一旦批改了工厂抽象类,那么所有的工厂子类也须要批改,这样显然扩大不不便。
<span style=”color: #FF6F00; “>猿兄碎碎念:</span>
大家可能一开始对于这 3 种工厂模式的了解有些混同,没有关系,猿兄我刚看的时候也没太了解三者的区别,然而我去把 3 种工厂模式都实现了一遍,而后再将代码和思维联合来推敲和了解,就明确了三种的区别和思维了。所以猿兄倡议大家肯定要 <span style=”color: #FF6F00; “> 多去入手实现,多去操作,再联合思维来推敲,</span> 能力更好的了解一个常识。
以上就是猿兄给大家带来的对于 工厂模式 的内容了。Spring 中的 BeanFactory 就是工厂模式中的简略工厂模式的体现,大家能够去看看相干内容。而后咱们平时设计程序时,也能够思考应用工厂模式的思维,对于优良的程序设计是有很大的帮忙的。
注:如果猿兄这篇博客有任何谬误和倡议,欢送大家留言,不胜感激!
<span style=”font-size:1.3em;font-weight: bold;”> 点个关注,不再迷路 </span>
这里是 <span style=”color: #FF6F00; “> 猿兄</span>,为你分享程序员的世界。
非常感谢各位 <span style=”color: #FF6F00; “>优良的程序员 </span> 们能看到这里,如果感觉文章还不错的话,<span style=”color: #FF6F00; “> 求点赞👍 求关注💗 求分享👬,</span> 对我来说真的 <span style=”color: #FF6F00; “>十分有用</span>!!!
继续更新文章,欢送微信搜寻: <span style=”color: #FF6F00; “> 猿兄 </span>。第一工夫获取最新文章,回复【<span style=”color: #FF6F00; “> 电子书</span>】还可收费获取我为大家筹备的各类技术书籍。
本文由博客一文多发平台 OpenWrite 公布!