第一章 java设计模式学习入门之工厂模式的使用
文章目录
前言
在面向对象编程中,创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例,但在某些情况下,new 操作符直接生成对象会存在一些问题,因为新对象的建立就是一个 “过程”,而不仅仅是一个操作,就像一个厂房中的一个机器运作。
一、工厂模式是什么?
工厂模式(Factory Pattern)是最常用的设计模式之一,它属于创建类型的设计模式。它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来指向新创建的对象。
二、简单工厂模式
1.UML图
简单工厂模式的UML图如下(示例):
这样客户需要得到一辆奔驰,直接使用工厂的创建方法,传入想要的奔驰车型号就行了,而不必自己去创建了。
2.代码实现
产品类:
abstract class Benz {
public Benz(){}
}
public class BenzC260 extends Benz {
public BenzC260() {
System.out.println("制造-->BenzC260");
}
}
public class BenzE300 extends BMW{
public BenzE300(){
System.out.println("制造-->BenzE300");
}
}
工厂类:
public class Factory {
public Benz createBenz(String type) {
switch (type) {
case "C260":
return new BenzC260();
case "E300":
return new BenzE300();
default:
break;
}
return null;
}
}
客户类
public class Customer {
public static void main(String[] args) {
Factory factory = new Factory();
Benz c260 = factory.createBenz("C260");
Benz e300 = factory.createBenz("E300");
}
}
简单工厂模式提供专门的工厂类用于创建对象,实现了对象创建和使用,客户端不需知道创建具体过程,只需知道产品类所对应的参数即可。通过引入配置文件,可以在不修改客户端代码的情况下更换和增加新的具体产品类。
但缺点在于不符合“开闭原则”,每次添加新产品就需要修改工厂类。在产品类型较多时,可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦这个类不能正常工作,整个系统都要受到影响。
三、工厂方法模式
1.UML图
工厂方法模式的UML图如下(示例):
工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。
2.代码实现
产品类
abstract class Benz {
public Benz(){}
}
public class BenzC260 extends Benz {
public BenzC260() {
System.out.println("制造-->BenzC260");
}
}
public class BenzE300 extends Benz{
public BenzE300(){
System.out.println("制造-->BenzE300");
}
}
工厂类
interface Benz {
BMW createBenz();
}
public class FactoryBenzC260 implements Benz{
@Override
public BenzC260 createBenz() {
return new BenzC260();
}
}
public class FactoryBenzE300 implements Benz {
@Override
public BenzE300 createBenz() {
return new BenzE300();
}
}
客户类
public class Customer {
public static void main(String[] args) {
FactoryBenzC260 factoryBenzC260 = new FactoryBenzC260();
BenzC260 c260 = factoryBenzC260.createBenz();
FactoryBenzE300 factoryBenzE300 = new FactoryBenzE300();
BenzE300 e300 = factoryBenzE300.createBenz();
}
}
三、抽象工厂模式
1.UML图
抽象工厂模式的UML图如下:
2.代码实现
通过抽象工厂模式,我们可以实现以下的效果:比如奔驰c260系列使用空调型号A和沙发A,而奔驰e300系列使用空调型号B和沙发B,在为260系列生产相关配件时,就无需制定配件的型号,它会自动根据车型生产对应的配件型号A。
产品类:
//沙发以及型号
public interface Sofa {}
public class SofaA implements Sofa{
public SofaA(){
System.out.println("制造-->SofaA");
}
}
public class SofaB implements Sofa{
public SofaB(){
System.out.println("制造-->SofaB");
}
}
//空调以及型号
public interface Aircondition {}
public class AirconditionA implements Aircondition{
public AirconditionA(){
System.out.println("制造-->AirconditionA");
}
}
public class AirconditionB implements Aircondition{
public AirconditionB(){
System.out.println("制造-->AirconditionB");
}
}
工厂类:
//创建工厂的接口
public interface AbstractFactory {
//制造沙发
public Sofa createSofa();
//制造空调
public Aircondition createAircondition();
}
//为奔驰c260系列
public class FactoryBenzC260 implements AbstractFactory{
@Override
public Sofa createSofa() {
return new SofaA();
}
@Override
public Aircondition createAircondition() {
return new AirconditionA();
}
}
//为奔驰e300系列
public class FactoryBenzE300 implements AbstractFactory {
@Override
public Sofa createSofa() {
return new SofaB();
}
@Override
public Aircondition createAircondition() {
return new AirconditionB();
}
}
客户类:
public class Customer {
public static void main(String[] args){
//生产奔驰c260系列配件
FactoryBenzC260 factoryBenzC260 = new FactoryFactoryBenzC260 ();
factoryBenzC260.createSofa();
factoryBenzC260.createAircondition();
//生产奔驰e300系列配件
FactoryBenzE300 factoryBenzE300 = new FactoryBenzE300();
factoryBenzE300.createSofa();
factoryBenzE300.createAircondition();
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了java设计模式中的工厂模式。工厂模式是最常用的设计模式之一,它属于创建型模式,它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。